feat(游戏共创): 收录(收藏)数据模型与绑定(块 1/3)

- `spacetime-module`:新增表 `game_distribution_collection`(`collection_id` 主键、`user_id` / `game_id` 各具名 btree 索引、`created_at`)。**防重靠确定性主键** `collection_id = "{user_id}:{game_id}"`(与 `profile_save_archive.archive_id` 同一写法):同一 (用户, 作品) 在结构上不可能有第二行,不依赖「事务里先查后写」(那种写法只在单写者假设下成立,分片/并发时两个事务都可能先查到不存在再各写一行);正因主键即约束,**不需要**再建 `(user_id, game_id)` 唯一索引,两个索引只服务两个读取方向
- 下架(未公开/软删除)**不删除**收藏行:收藏是用户态事实,读侧投影时才按当前公开性过滤,作品重新公开后同一行自动回到列表(注释写明)
- 新增动作常量、4 个输入类型、3 个结果类型、3 个事务(collect / uncollect / list)+ 读态 helper + 4 个 procedure;`uncollect` 按确定性键删除且**不要求作品仍公开**(下架后拒绝取消会给用户留下清理不掉的脏行);`list` 走 `user_id` 索引 + 既有 `public_game_distribution_snapshot` 投影,只含当前公开可读作品
- 新增 `module-game-distribution/src/collection.rs`:两条纯函数(`game_distribution_collection_id`、`game_distribution_collection_visible`)+ 单测——后者用「同一行、四种可见性输入」直接钉住「已收藏 → 下架 → 列表不含 → 重新公开 → 列表又含」这条链路,不必起真库
- `migration.rs`:新表进白名单并补中文注释
- `spacetime-client`:record + 3 个 mapper + 4 个方法 + 2 个 RecordInput,并按既有做法只保留 `module_bindings/game_distribution*`(13 个新文件)与 `module_bindings.rs` 的生成改动、还原其余 rustfmt 漂移
- 门禁:wasm build 0;`cargo check --all-targets` 0;`cargo test -p module-game-distribution` 75 passed;`cargo test -p spacetime-module` 273 passed / 1 ignored(含 4 条新事务结构断言);`cargo fmt --all -- --check` 0
This commit is contained in:
2026-10-06 01:13:08 +08:00
parent c3030eddba
commit 77c30bb7b2
22 changed files with 1473 additions and 15 deletions
@@ -0,0 +1,82 @@
//! 收藏(收录)的纯函数规则。
//!
//! 表与事务在 `spacetime-module::game_distribution`;这里只放能被不起 SpacetimeDB 的单测钉住的
//! 两条规则:确定性主键的构造,以及「收藏行是否出现在列表投影里」的可见性判定。
/// 收藏主键:`{user_id}:{game_id}`。
///
/// 与 `profile_save_archive.archive_id`(`spacetime-module` 的 `runtime/profile.rs`)同一写法:
/// 平台签发的两个标识用冒号拼成确定性 ID。`user_id` 由平台签发(形如 `usr_*` / 微信侧标识),
/// `game_id` 由本领域生成(`game-*`),两者都不含 `:`,因此组合是单射。
///
/// 用确定性主键而不是随机 ID,是为了让**去重由结构保证,而不是由流程保证**:同一
/// (用户, 作品) 只可能有一行,这一点由主键约束本身成立。相对地,「事务里先查后写」只在
/// 单写者假设下成立——将来分片或并发写同一对 (用户, 作品) 时,两个事务都可能先查到
/// 「不存在」,然后各写一行。也正因为主键已经是那条约束,这张表**不需要**再建
/// `(user_id, game_id)` 唯一索引。
pub fn game_distribution_collection_id(user_id: &str, game_id: &str) -> String {
format!("{user_id}:{game_id}")
}
/// 收藏行是否应出现在「我的收藏(收录)」列表里。
///
/// 只看作品**当前**是否公开可读:未软删除、可见性为 `published`、且存在当前公开版本
/// (`has_public_version` 由调用方按 `public_game_distribution_version` 命中给出)。
///
/// 判定只在**投影时**发生,收藏行本身不因此被删除:作品下架后该行只是不再出现在响应里,
/// 作品重新公开后同一行会再次出现。把它做成纯函数,就能用「同一行、不同可见性」直接钉住
/// 「已收藏 → 下架 → 列表不含 → 重新公开 → 列表又含」这条链路,不必起真库。
pub fn game_distribution_collection_visible(
is_deleted: bool,
is_published: bool,
has_public_version: bool,
) -> bool {
!is_deleted && is_published && has_public_version
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn collection_id_is_deterministic_and_pair_specific() {
assert_eq!(
game_distribution_collection_id("usr_1", "game_a"),
"usr_1:game_a"
);
// 同一对组合永远得到同一个键(幂等重放与「重复收藏只留一行」都依赖这一点)。
assert_eq!(
game_distribution_collection_id("usr_1", "game_a"),
game_distribution_collection_id("usr_1", "game_a")
);
// 换用户或换作品必须换键,否则不同用户/作品的收藏会互相覆盖。
assert_ne!(
game_distribution_collection_id("usr_1", "game_a"),
game_distribution_collection_id("usr_2", "game_a")
);
assert_ne!(
game_distribution_collection_id("usr_1", "game_a"),
game_distribution_collection_id("usr_1", "game_b")
);
}
/// 「已收藏 → 作品下架 → 列表不含 → 重新公开 → 列表又含」。
///
/// 收藏行在整条链路里都存在;变化的只是投影判定,因此同一行在两次判定间翻转,
/// 不需要删除再重建行。
#[test]
fn collection_row_survives_unpublish_and_returns_after_republish() {
// 已收藏且作品公开可读:出现在列表里。
assert!(game_distribution_collection_visible(false, true, true));
// 作者下架:行还在,但投影时被过滤。
assert!(!game_distribution_collection_visible(false, false, true));
// 管理员暂停 / 幽灵可见性同样不算公开可读。
assert!(!game_distribution_collection_visible(false, false, true));
// 软删除:作品不再公开可读。
assert!(!game_distribution_collection_visible(true, true, true));
// 可见性仍是 published 但没有当前公开版本(例如版本被撤回)也按不可读处理。
assert!(!game_distribution_collection_visible(false, true, false));
// 重新公开:同一行再次可见。
assert!(game_distribution_collection_visible(false, true, true));
}
}
@@ -1,4 +1,5 @@
mod application;
mod collection;
mod commands;
mod domain;
mod errors;
@@ -20,6 +21,7 @@ pub use application::{
GameDistributionService, GameOperationResult, InMemoryGameDistributionStore,
PublicationOperationResult,
};
pub use collection::{game_distribution_collection_id, game_distribution_collection_visible};
pub use commands::{CreateGameInput, CreateVersionInput, IdempotencyRequest, ReviewDecision};
pub use domain::{
FORK_AUTHORIZATION_FORBIDDEN, FORK_AUTHORIZATION_FULL, FORK_AUTHORIZATION_NON_COMMERCIAL,
@@ -25,15 +25,16 @@ pub mod game_distribution;
pub use game_distribution::{
GameDistributionAdminGameListRecordInput, GameDistributionAdminUserReviewListRecordInput,
GameDistributionApproveRecordInput, GameDistributionCancelVersionRecordInput,
GameDistributionConfirmPackageRecordInput, GameDistributionConfirmProjectBundleRecordInput,
GameDistributionCreateGameRecordInput, GameDistributionCreateVersionRecordInput,
GameDistributionDeleteGameRecordInput, GameDistributionFailUploadRecordInput,
GameDistributionGetGameRecordInput, GameDistributionOwnerGameListRecordInput,
GameDistributionPlayCountIncrementRecordInput, GameDistributionPublicGameListRecordInput,
GameDistributionRejectRecordInput, GameDistributionRestoreRecordInput,
GameDistributionReviewGameListRecordInput, GameDistributionReviewModerationRecordInput,
GameDistributionSetForkAuthorizationRecordInput, GameDistributionSubmitReviewRecordInput,
GameDistributionSuspendRecordInput, GameDistributionUnpublishRecordInput,
GameDistributionCollectGameRecordInput, GameDistributionConfirmPackageRecordInput,
GameDistributionConfirmProjectBundleRecordInput, GameDistributionCreateGameRecordInput,
GameDistributionCreateVersionRecordInput, GameDistributionDeleteGameRecordInput,
GameDistributionFailUploadRecordInput, GameDistributionGetGameRecordInput,
GameDistributionOwnerGameListRecordInput, GameDistributionPlayCountIncrementRecordInput,
GameDistributionPublicGameListRecordInput, GameDistributionRejectRecordInput,
GameDistributionRestoreRecordInput, GameDistributionReviewGameListRecordInput,
GameDistributionReviewModerationRecordInput, GameDistributionSetForkAuthorizationRecordInput,
GameDistributionSubmitReviewRecordInput, GameDistributionSuspendRecordInput,
GameDistributionUncollectGameRecordInput, GameDistributionUnpublishRecordInput,
GameDistributionUpdateMetadataRecordInput,
};
#[path = "active/external_generation.rs"]
@@ -98,9 +98,9 @@ pub use self::external_generation::{
pub use self::game_distribution::{
GameDistributionAdminGameRecord, GameDistributionAdminUserReviewDetailRecord,
GameDistributionAdminUserReviewListRecord, GameDistributionAdminUserReviewRecord,
GameDistributionAdminVersionRecord, GameDistributionDerivedGamesRecord,
GameDistributionForkSourceRecord, GameDistributionGameRecord,
GameDistributionLineageNodeRecord, GameDistributionLineageRecord,
GameDistributionAdminVersionRecord, GameDistributionCollectionMutationRecord,
GameDistributionDerivedGamesRecord, GameDistributionForkSourceRecord,
GameDistributionGameRecord, GameDistributionLineageNodeRecord, GameDistributionLineageRecord,
GameDistributionLineageTreeRecord, GameDistributionOwnerGameRecord,
GameDistributionPublicGameRecord, GameDistributionRatingSummaryRecord,
GameDistributionReviewGameListRecord, GameDistributionReviewGameRecord,
@@ -171,7 +171,9 @@ pub(crate) use self::external_generation::{
};
pub(crate) use self::game_distribution::{
ensure_admin_user_review_result, ensure_user_review_result, map_admin_user_review,
map_game_distribution_admin_game_list_result, map_game_distribution_derived_games_result,
map_game_distribution_admin_game_list_result, map_game_distribution_collection_list_result,
map_game_distribution_collection_mutation_result,
map_game_distribution_collection_state_result, map_game_distribution_derived_games_result,
map_game_distribution_fork_source_result, map_game_distribution_game_result,
map_game_distribution_lineage_result, map_game_distribution_owner_game_list_result,
map_game_distribution_public_game_list_result, map_game_distribution_public_game_result,
@@ -341,6 +341,16 @@ pub struct GameDistributionForkSourceRecord {
pub project_bundle_bytes: u64,
}
/// 收藏(收录)写入 / 取消后的权威投影值。
///
/// `collected` 是**调用后**的收藏事实(不是前端本地状态);`replayed` 只在带幂等键的「收藏」
/// 上有意义(取消按确定性主键删除,天然幂等,恒为 `false`)。
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct GameDistributionCollectionMutationRecord {
pub collected: bool,
pub replayed: bool,
}
fn map_game(
value: crate::module_bindings::GameDistributionGameSnapshot,
) -> GameDistributionGameRecord {
@@ -533,6 +543,39 @@ pub(crate) fn map_game_distribution_fork_source_result(
})
}
/// 收藏 / 取消收藏结果:`ok == false` 是服务端失败(走既有错误映射,含 404 / 409)。
pub(crate) fn map_game_distribution_collection_mutation_result(
result: crate::module_bindings::GameDistributionCollectionMutationResult,
) -> Result<GameDistributionCollectionMutationRecord, SpacetimeClientError> {
if !result.ok {
return Err(SpacetimeClientError::procedure_failed(result.error_message));
}
Ok(GameDistributionCollectionMutationRecord {
collected: result.collected,
replayed: result.replayed,
})
}
/// 公开详情的收藏态:只回传布尔,`ok == false` 走既有错误映射。
pub(crate) fn map_game_distribution_collection_state_result(
result: crate::module_bindings::GameDistributionCollectionStateResult,
) -> Result<bool, SpacetimeClientError> {
if !result.ok {
return Err(SpacetimeClientError::procedure_failed(result.error_message));
}
Ok(result.collected)
}
/// 「我的收藏(收录)」列表:逐条用公开目录同一份公开投影映射,形状因此与公开目录一致。
pub(crate) fn map_game_distribution_collection_list_result(
result: crate::module_bindings::GameDistributionCollectionListResult,
) -> Result<Vec<GameDistributionPublicGameRecord>, SpacetimeClientError> {
if !result.ok {
return Err(SpacetimeClientError::procedure_failed(result.error_message));
}
Ok(result.games.into_iter().map(map_public_game).collect())
}
fn map_public_game(
value: crate::module_bindings::GameDistributionPublicGameSnapshot,
) -> GameDistributionPublicGameRecord {
@@ -276,6 +276,23 @@ pub struct GameDistributionDeleteGameRecordInput {
pub now_micros: i64,
}
/// 收藏(收录)公开作品;`user_id` 来自 api-server 的认证主体,调用方不能指定他人。
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GameDistributionCollectGameRecordInput {
pub game_id: String,
pub user_id: String,
pub idempotency_key: String,
pub request_digest: String,
pub now_micros: i64,
}
/// 取消收藏(收录)。按确定性主键删除,天然幂等,因此不带幂等键。
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GameDistributionUncollectGameRecordInput {
pub game_id: String,
pub user_id: String,
}
impl SpacetimeClient {
pub async fn list_admin_game_distribution_user_reviews(
&self,
@@ -717,6 +734,105 @@ impl SpacetimeClient {
.await
}
/// 收藏(收录)某公开作品;命中同键幂等收据时回 `replayed = true`。
pub async fn set_game_distribution_collection(
&self,
input: GameDistributionCollectGameRecordInput,
) -> Result<GameDistributionCollectionMutationRecord, SpacetimeClientError> {
let input = crate::module_bindings::GameDistributionCollectGameInput {
game_id: input.game_id,
user_id: input.user_id,
idempotency_key: input.idempotency_key,
request_digest: input.request_digest,
now_micros: input.now_micros,
};
self.call_after_connect(
"set_game_distribution_collection",
move |connection, sender| {
connection
.procedures()
.set_game_distribution_collection_and_return_then(input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_game_distribution_collection_mutation_result);
send_once(&sender, mapped);
});
},
)
.await
}
/// 取消收藏(收录);按确定性主键删除,重复调用结果相同。
pub async fn unset_game_distribution_collection(
&self,
input: GameDistributionUncollectGameRecordInput,
) -> Result<GameDistributionCollectionMutationRecord, SpacetimeClientError> {
let input = crate::module_bindings::GameDistributionUncollectGameInput {
game_id: input.game_id,
user_id: input.user_id,
};
self.call_after_connect(
"unset_game_distribution_collection",
move |connection, sender| {
connection
.procedures()
.unset_game_distribution_collection_and_return_then(input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_game_distribution_collection_mutation_result);
send_once(&sender, mapped);
});
},
)
.await
}
/// 「我的收藏(收录)」列表;只返回当前公开可读的作品,形状与公开目录一致。
pub async fn list_game_distribution_collections(
&self,
user_id: String,
) -> Result<Vec<GameDistributionPublicGameRecord>, SpacetimeClientError> {
let input = crate::module_bindings::GameDistributionCollectionListInput { user_id };
self.call_after_connect(
"list_game_distribution_collections",
move |connection, sender| {
connection
.procedures()
.list_game_distribution_collections_and_return_then(input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_game_distribution_collection_list_result);
send_once(&sender, mapped);
});
},
)
.await
}
/// 某用户是否已收藏某作品;公开详情用它计算 `collected`。
pub async fn is_game_distribution_collected(
&self,
game_id: String,
user_id: String,
) -> Result<bool, SpacetimeClientError> {
let input =
crate::module_bindings::GameDistributionCollectionStateInput { game_id, user_id };
self.call_after_connect(
"is_game_distribution_collected",
move |connection, sender| {
connection
.procedures()
.is_game_distribution_collected_and_return_then(input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_game_distribution_collection_state_result);
send_once(&sender, mapped);
});
},
)
.await
}
/// 批量累加已公开游戏的游玩次数;非公开游戏由事务静默跳过。
pub async fn increment_game_distribution_game_play_counts(
&self,
@@ -430,6 +430,14 @@ pub mod game_distribution_admin_user_review_snapshot_type;
pub mod game_distribution_admin_version_snapshot_type;
pub mod game_distribution_approve_input_type;
pub mod game_distribution_cancel_version_input_type;
pub mod game_distribution_collect_game_input_type;
pub mod game_distribution_collection_list_input_type;
pub mod game_distribution_collection_list_result_type;
pub mod game_distribution_collection_mutation_result_type;
pub mod game_distribution_collection_state_input_type;
pub mod game_distribution_collection_state_result_type;
pub mod game_distribution_collection_table;
pub mod game_distribution_collection_type;
pub mod game_distribution_confirm_package_input_type;
pub mod game_distribution_confirm_project_bundle_input_type;
pub mod game_distribution_create_game_input_type;
@@ -479,6 +487,7 @@ pub mod game_distribution_review_type;
pub mod game_distribution_set_fork_authorization_input_type;
pub mod game_distribution_submit_review_input_type;
pub mod game_distribution_suspend_input_type;
pub mod game_distribution_uncollect_game_input_type;
pub mod game_distribution_unpublish_input_type;
pub mod game_distribution_update_metadata_input_type;
pub mod game_distribution_user_review_input_type;
@@ -537,6 +546,7 @@ pub mod import_database_migration_incremental_from_chunks_procedure;
pub mod import_database_migration_incremental_from_file_procedure;
pub mod increment_game_distribution_game_play_counts_and_return_procedure;
pub mod initialize_editor_generation_pricing_config_if_missing_and_return_procedure;
pub mod is_game_distribution_collected_and_return_procedure;
pub mod list_admin_accounts_and_return_procedure;
pub mod list_admin_game_distribution_games_and_return_procedure;
pub mod list_admin_game_distribution_user_reviews_and_return_procedure;
@@ -549,6 +559,7 @@ pub mod list_error_reports_and_return_procedure;
pub mod list_external_api_keys_and_return_procedure;
pub mod list_external_generation_job_summaries_and_return_procedure;
pub mod list_external_generation_jobs_and_return_procedure;
pub mod list_game_distribution_collections_and_return_procedure;
pub mod list_game_distribution_derived_games_and_return_procedure;
pub mod list_game_distribution_games_and_return_procedure;
pub mod list_game_distribution_review_games_and_return_procedure;
@@ -863,6 +874,7 @@ pub mod save_editor_project_layout_v_2_and_return_procedure;
pub mod save_game_distribution_my_review_and_return_procedure;
pub mod seed_analytics_date_dimensions_reducer;
pub mod set_editor_showcase_asset_like_for_viewer_and_return_procedure;
pub mod set_game_distribution_collection_and_return_procedure;
pub mod set_game_distribution_fork_authorization_and_return_procedure;
pub mod set_payment_order_provider_code_and_return_procedure;
pub mod settle_llm_router_quota_and_return_procedure;
@@ -880,6 +892,7 @@ pub mod tracking_event_table;
pub mod tracking_event_type;
pub mod unfollow_creator_and_return_procedure;
pub mod unpublish_game_distribution_game_and_return_procedure;
pub mod unset_game_distribution_collection_and_return_procedure;
pub mod update_admin_account_and_return_procedure;
pub mod update_editor_asset_and_return_procedure;
pub mod update_editor_asset_folder_and_return_procedure;
@@ -1327,6 +1340,14 @@ pub use game_distribution_admin_user_review_snapshot_type::GameDistributionAdmin
pub use game_distribution_admin_version_snapshot_type::GameDistributionAdminVersionSnapshot;
pub use game_distribution_approve_input_type::GameDistributionApproveInput;
pub use game_distribution_cancel_version_input_type::GameDistributionCancelVersionInput;
pub use game_distribution_collect_game_input_type::GameDistributionCollectGameInput;
pub use game_distribution_collection_list_input_type::GameDistributionCollectionListInput;
pub use game_distribution_collection_list_result_type::GameDistributionCollectionListResult;
pub use game_distribution_collection_mutation_result_type::GameDistributionCollectionMutationResult;
pub use game_distribution_collection_state_input_type::GameDistributionCollectionStateInput;
pub use game_distribution_collection_state_result_type::GameDistributionCollectionStateResult;
pub use game_distribution_collection_table::*;
pub use game_distribution_collection_type::GameDistributionCollection;
pub use game_distribution_confirm_package_input_type::GameDistributionConfirmPackageInput;
pub use game_distribution_confirm_project_bundle_input_type::GameDistributionConfirmProjectBundleInput;
pub use game_distribution_create_game_input_type::GameDistributionCreateGameInput;
@@ -1376,6 +1397,7 @@ pub use game_distribution_review_type::GameDistributionReview;
pub use game_distribution_set_fork_authorization_input_type::GameDistributionSetForkAuthorizationInput;
pub use game_distribution_submit_review_input_type::GameDistributionSubmitReviewInput;
pub use game_distribution_suspend_input_type::GameDistributionSuspendInput;
pub use game_distribution_uncollect_game_input_type::GameDistributionUncollectGameInput;
pub use game_distribution_unpublish_input_type::GameDistributionUnpublishInput;
pub use game_distribution_update_metadata_input_type::GameDistributionUpdateMetadataInput;
pub use game_distribution_user_review_input_type::GameDistributionUserReviewInput;
@@ -1434,6 +1456,7 @@ pub use import_database_migration_incremental_from_chunks_procedure::import_data
pub use import_database_migration_incremental_from_file_procedure::import_database_migration_incremental_from_file;
pub use increment_game_distribution_game_play_counts_and_return_procedure::increment_game_distribution_game_play_counts_and_return;
pub use initialize_editor_generation_pricing_config_if_missing_and_return_procedure::initialize_editor_generation_pricing_config_if_missing_and_return;
pub use is_game_distribution_collected_and_return_procedure::is_game_distribution_collected_and_return;
pub use list_admin_accounts_and_return_procedure::list_admin_accounts_and_return;
pub use list_admin_game_distribution_games_and_return_procedure::list_admin_game_distribution_games_and_return;
pub use list_admin_game_distribution_user_reviews_and_return_procedure::list_admin_game_distribution_user_reviews_and_return;
@@ -1446,6 +1469,7 @@ pub use list_error_reports_and_return_procedure::list_error_reports_and_return;
pub use list_external_api_keys_and_return_procedure::list_external_api_keys_and_return;
pub use list_external_generation_job_summaries_and_return_procedure::list_external_generation_job_summaries_and_return;
pub use list_external_generation_jobs_and_return_procedure::list_external_generation_jobs_and_return;
pub use list_game_distribution_collections_and_return_procedure::list_game_distribution_collections_and_return;
pub use list_game_distribution_derived_games_and_return_procedure::list_game_distribution_derived_games_and_return;
pub use list_game_distribution_games_and_return_procedure::list_game_distribution_games_and_return;
pub use list_game_distribution_review_games_and_return_procedure::list_game_distribution_review_games_and_return;
@@ -1760,6 +1784,7 @@ pub use save_editor_project_layout_v_2_and_return_procedure::save_editor_project
pub use save_game_distribution_my_review_and_return_procedure::save_game_distribution_my_review_and_return;
pub use seed_analytics_date_dimensions_reducer::seed_analytics_date_dimensions;
pub use set_editor_showcase_asset_like_for_viewer_and_return_procedure::set_editor_showcase_asset_like_for_viewer_and_return;
pub use set_game_distribution_collection_and_return_procedure::set_game_distribution_collection_and_return;
pub use set_game_distribution_fork_authorization_and_return_procedure::set_game_distribution_fork_authorization_and_return;
pub use set_payment_order_provider_code_and_return_procedure::set_payment_order_provider_code_and_return;
pub use settle_llm_router_quota_and_return_procedure::settle_llm_router_quota_and_return;
@@ -1777,6 +1802,7 @@ pub use tracking_event_table::*;
pub use tracking_event_type::TrackingEvent;
pub use unfollow_creator_and_return_procedure::unfollow_creator_and_return;
pub use unpublish_game_distribution_game_and_return_procedure::unpublish_game_distribution_game_and_return;
pub use unset_game_distribution_collection_and_return_procedure::unset_game_distribution_collection_and_return;
pub use update_admin_account_and_return_procedure::update_admin_account_and_return;
pub use update_editor_asset_and_return_procedure::update_editor_asset_and_return;
pub use update_editor_asset_folder_and_return_procedure::update_editor_asset_folder_and_return;
@@ -1952,6 +1978,7 @@ pub struct DbUpdate {
external_generation_job_event: __sdk::TableUpdate<ExternalGenerationJobEvent>,
external_generation_job_summary: __sdk::TableUpdate<ExternalGenerationJobSummary>,
feature_gate_config: __sdk::TableUpdate<FeatureGateConfig>,
game_distribution_collection: __sdk::TableUpdate<GameDistributionCollection>,
game_distribution_game: __sdk::TableUpdate<GameDistributionGame>,
game_distribution_idempotency_receipt: __sdk::TableUpdate<GameDistributionIdempotencyReceipt>,
game_distribution_lineage: __sdk::TableUpdate<GameDistributionLineage>,
@@ -2168,6 +2195,9 @@ impl TryFrom<__ws::v2::TransactionUpdate> for DbUpdate {
"feature_gate_config" => db_update
.feature_gate_config
.append(feature_gate_config_table::parse_table_update(table_update)?),
"game_distribution_collection" => db_update.game_distribution_collection.append(
game_distribution_collection_table::parse_table_update(table_update)?,
),
"game_distribution_game" => db_update.game_distribution_game.append(
game_distribution_game_table::parse_table_update(table_update)?,
),
@@ -2587,6 +2617,12 @@ impl __sdk::DbUpdate for DbUpdate {
&self.feature_gate_config,
)
.with_updates_by_pk(|row| &row.gate_key);
diff.game_distribution_collection = cache
.apply_diff_to_table::<GameDistributionCollection>(
"game_distribution_collection",
&self.game_distribution_collection,
)
.with_updates_by_pk(|row| &row.collection_id);
diff.game_distribution_game = cache
.apply_diff_to_table::<GameDistributionGame>(
"game_distribution_game",
@@ -2990,6 +3026,9 @@ impl __sdk::DbUpdate for DbUpdate {
"feature_gate_config" => db_update
.feature_gate_config
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
"game_distribution_collection" => db_update
.game_distribution_collection
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
"game_distribution_game" => db_update
.game_distribution_game
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
@@ -3282,6 +3321,9 @@ impl __sdk::DbUpdate for DbUpdate {
"feature_gate_config" => db_update
.feature_gate_config
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
"game_distribution_collection" => db_update
.game_distribution_collection
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
"game_distribution_game" => db_update
.game_distribution_game
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
@@ -3492,6 +3534,7 @@ pub struct AppliedDiff<'r> {
external_generation_job_event: __sdk::TableAppliedDiff<'r, ExternalGenerationJobEvent>,
external_generation_job_summary: __sdk::TableAppliedDiff<'r, ExternalGenerationJobSummary>,
feature_gate_config: __sdk::TableAppliedDiff<'r, FeatureGateConfig>,
game_distribution_collection: __sdk::TableAppliedDiff<'r, GameDistributionCollection>,
game_distribution_game: __sdk::TableAppliedDiff<'r, GameDistributionGame>,
game_distribution_idempotency_receipt:
__sdk::TableAppliedDiff<'r, GameDistributionIdempotencyReceipt>,
@@ -3769,6 +3812,11 @@ impl<'r> __sdk::AppliedDiff<'r> for AppliedDiff<'r> {
&self.feature_gate_config,
event,
);
callbacks.invoke_table_row_callbacks::<GameDistributionCollection>(
"game_distribution_collection",
&self.game_distribution_collection,
event,
);
callbacks.invoke_table_row_callbacks::<GameDistributionGame>(
"game_distribution_game",
&self.game_distribution_game,
@@ -4714,6 +4762,7 @@ impl __sdk::SpacetimeModule for RemoteModule {
external_generation_job_event_table::register_table(client_cache);
external_generation_job_summary_table::register_table(client_cache);
feature_gate_config_table::register_table(client_cache);
game_distribution_collection_table::register_table(client_cache);
game_distribution_game_table::register_table(client_cache);
game_distribution_idempotency_receipt_table::register_table(client_cache);
game_distribution_lineage_table::register_table(client_cache);
@@ -4809,6 +4858,7 @@ impl __sdk::SpacetimeModule for RemoteModule {
"external_generation_job_event",
"external_generation_job_summary",
"feature_gate_config",
"game_distribution_collection",
"game_distribution_game",
"game_distribution_idempotency_receipt",
"game_distribution_lineage",
@@ -0,0 +1,19 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectGameInput {
pub game_id: String,
pub user_id: String,
pub idempotency_key: String,
pub request_digest: String,
pub now_micros: i64,
}
impl __sdk::InModule for GameDistributionCollectGameInput {
type Module = super::RemoteModule;
}
@@ -0,0 +1,15 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectionListInput {
pub user_id: String,
}
impl __sdk::InModule for GameDistributionCollectionListInput {
type Module = super::RemoteModule;
}
@@ -0,0 +1,19 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::game_distribution_public_game_snapshot_type::GameDistributionPublicGameSnapshot;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectionListResult {
pub ok: bool,
pub games: Vec<GameDistributionPublicGameSnapshot>,
pub error_message: Option<String>,
}
impl __sdk::InModule for GameDistributionCollectionListResult {
type Module = super::RemoteModule;
}
@@ -0,0 +1,18 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectionMutationResult {
pub ok: bool,
pub collected: bool,
pub replayed: bool,
pub error_message: Option<String>,
}
impl __sdk::InModule for GameDistributionCollectionMutationResult {
type Module = super::RemoteModule;
}
@@ -0,0 +1,16 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectionStateInput {
pub game_id: String,
pub user_id: String,
}
impl __sdk::InModule for GameDistributionCollectionStateInput {
type Module = super::RemoteModule;
}
@@ -0,0 +1,17 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollectionStateResult {
pub ok: bool,
pub collected: bool,
pub error_message: Option<String>,
}
impl __sdk::InModule for GameDistributionCollectionStateResult {
type Module = super::RemoteModule;
}
@@ -0,0 +1,235 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use super::game_distribution_collection_type::GameDistributionCollection;
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
/// Table handle for the table `game_distribution_collection`.
///
/// Obtain a handle from the [`GameDistributionCollectionTableAccess::game_distribution_collection`] method on [`super::RemoteTables`],
/// like `ctx.db.game_distribution_collection()`.
///
/// Users are encouraged not to explicitly reference this type,
/// but to directly chain method calls,
/// like `ctx.db.game_distribution_collection().on_insert(...)`.
pub struct GameDistributionCollectionTableHandle<'ctx> {
imp: __sdk::TableHandle<GameDistributionCollection>,
ctx: std::marker::PhantomData<&'ctx super::RemoteTables>,
}
/// Lifetime-aware accessor marker for the table `game_distribution_collection`.
pub struct GameDistributionCollectionTableAccessor;
impl __sdk::TableAccessor<super::RemoteTables> for GameDistributionCollectionTableAccessor {
type Row = GameDistributionCollection;
type Handle<'db> = GameDistributionCollectionTableHandle<'db>;
fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> {
db.game_distribution_collection()
}
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the table `game_distribution_collection`.
///
/// Implemented for [`super::RemoteTables`].
pub trait GameDistributionCollectionTableAccess {
#[allow(non_snake_case)]
/// Obtain a [`GameDistributionCollectionTableHandle`], which mediates access to the table `game_distribution_collection`.
fn game_distribution_collection(&self) -> GameDistributionCollectionTableHandle<'_>;
}
impl GameDistributionCollectionTableAccess for super::RemoteTables {
fn game_distribution_collection(&self) -> GameDistributionCollectionTableHandle<'_> {
GameDistributionCollectionTableHandle {
imp: self
.imp
.get_table::<GameDistributionCollection>("game_distribution_collection"),
ctx: std::marker::PhantomData,
}
}
}
pub struct GameDistributionCollectionInsertCallbackId(__sdk::CallbackId);
pub struct GameDistributionCollectionDeleteCallbackId(__sdk::CallbackId);
impl<'ctx> __sdk::TableLike for GameDistributionCollectionTableHandle<'ctx> {
type Row = GameDistributionCollection;
type EventContext = super::EventContext;
fn count(&self) -> u64 {
self.imp.count()
}
fn iter(&self) -> impl Iterator<Item = GameDistributionCollection> + '_ {
self.imp.iter()
}
}
impl<'ctx> __sdk::Table for GameDistributionCollectionTableHandle<'ctx> {
type Row = GameDistributionCollection;
type EventContext = super::EventContext;
fn count(&self) -> u64 {
self.imp.count()
}
fn iter(&self) -> impl Iterator<Item = GameDistributionCollection> + '_ {
self.imp.iter()
}
type InsertCallbackId = GameDistributionCollectionInsertCallbackId;
fn on_insert(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionInsertCallbackId {
GameDistributionCollectionInsertCallbackId(self.imp.on_insert(Box::new(callback)))
}
fn remove_on_insert(&self, callback: GameDistributionCollectionInsertCallbackId) {
self.imp.remove_on_insert(callback.0)
}
type DeleteCallbackId = GameDistributionCollectionDeleteCallbackId;
fn on_delete(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionDeleteCallbackId {
GameDistributionCollectionDeleteCallbackId(self.imp.on_delete(Box::new(callback)))
}
fn remove_on_delete(&self, callback: GameDistributionCollectionDeleteCallbackId) {
self.imp.remove_on_delete(callback.0)
}
}
impl<'ctx> __sdk::WithInsert for GameDistributionCollectionTableHandle<'ctx> {
type InsertCallbackId = GameDistributionCollectionInsertCallbackId;
fn on_insert(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionInsertCallbackId {
GameDistributionCollectionInsertCallbackId(self.imp.on_insert(Box::new(callback)))
}
fn remove_on_insert(&self, callback: GameDistributionCollectionInsertCallbackId) {
self.imp.remove_on_insert(callback.0)
}
}
impl<'ctx> __sdk::WithDelete for GameDistributionCollectionTableHandle<'ctx> {
type DeleteCallbackId = GameDistributionCollectionDeleteCallbackId;
fn on_delete(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionDeleteCallbackId {
GameDistributionCollectionDeleteCallbackId(self.imp.on_delete(Box::new(callback)))
}
fn remove_on_delete(&self, callback: GameDistributionCollectionDeleteCallbackId) {
self.imp.remove_on_delete(callback.0)
}
}
pub struct GameDistributionCollectionUpdateCallbackId(__sdk::CallbackId);
impl<'ctx> __sdk::TableWithPrimaryKey for GameDistributionCollectionTableHandle<'ctx> {
type UpdateCallbackId = GameDistributionCollectionUpdateCallbackId;
fn on_update(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionUpdateCallbackId {
GameDistributionCollectionUpdateCallbackId(self.imp.on_update(Box::new(callback)))
}
fn remove_on_update(&self, callback: GameDistributionCollectionUpdateCallbackId) {
self.imp.remove_on_update(callback.0)
}
}
impl<'ctx> __sdk::WithUpdate for GameDistributionCollectionTableHandle<'ctx> {
type UpdateCallbackId = GameDistributionCollectionUpdateCallbackId;
fn on_update(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static,
) -> GameDistributionCollectionUpdateCallbackId {
GameDistributionCollectionUpdateCallbackId(self.imp.on_update(Box::new(callback)))
}
fn remove_on_update(&self, callback: GameDistributionCollectionUpdateCallbackId) {
self.imp.remove_on_update(callback.0)
}
}
/// Access to the `collection_id` unique index on the table `game_distribution_collection`,
/// which allows point queries on the field of the same name
/// via the [`GameDistributionCollectionCollectionIdUnique::find`] method.
///
/// Users are encouraged not to explicitly reference this type,
/// but to directly chain method calls,
/// like `ctx.db.game_distribution_collection().collection_id().find(...)`.
pub struct GameDistributionCollectionCollectionIdUnique<'ctx> {
imp: __sdk::UniqueConstraintHandle<GameDistributionCollection, String>,
phantom: std::marker::PhantomData<&'ctx super::RemoteTables>,
}
impl<'ctx> GameDistributionCollectionTableHandle<'ctx> {
/// Get a handle on the `collection_id` unique index on the table `game_distribution_collection`.
pub fn collection_id(&self) -> GameDistributionCollectionCollectionIdUnique<'ctx> {
GameDistributionCollectionCollectionIdUnique {
imp: self.imp.get_unique_constraint::<String>("collection_id"),
phantom: std::marker::PhantomData,
}
}
}
impl<'ctx> GameDistributionCollectionCollectionIdUnique<'ctx> {
/// Find the subscribed row whose `collection_id` column value is equal to `col_val`,
/// if such a row is present in the client cache.
pub fn find(&self, col_val: &String) -> Option<GameDistributionCollection> {
self.imp.find(col_val)
}
}
#[doc(hidden)]
pub(super) fn register_table(client_cache: &mut __sdk::ClientCache<super::RemoteModule>) {
let _table = client_cache
.get_or_make_table::<GameDistributionCollection>("game_distribution_collection");
_table.add_unique_constraint::<String>("collection_id", |row| &row.collection_id);
}
#[doc(hidden)]
pub(super) fn parse_table_update(
raw_updates: __ws::v2::TableUpdate,
) -> __sdk::Result<__sdk::TableUpdate<GameDistributionCollection>> {
__sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| {
__sdk::InternalError::failed_parse("TableUpdate<GameDistributionCollection>", "TableUpdate")
.with_cause(e)
.into()
})
}
#[allow(non_camel_case_types)]
/// Extension trait for query builder access to the table `GameDistributionCollection`.
///
/// Implemented for [`__sdk::QueryTableAccessor`].
pub trait game_distribution_collectionQueryTableAccess {
#[allow(non_snake_case)]
/// Get a query builder for the table `GameDistributionCollection`.
fn game_distribution_collection(
&self,
) -> __sdk::__query_builder::Table<GameDistributionCollection>;
}
impl game_distribution_collectionQueryTableAccess for __sdk::QueryTableAccessor {
fn game_distribution_collection(
&self,
) -> __sdk::__query_builder::Table<GameDistributionCollection> {
__sdk::__query_builder::Table::new("game_distribution_collection")
}
}
@@ -0,0 +1,62 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionCollection {
pub collection_id: String,
pub user_id: String,
pub game_id: String,
pub created_at: __sdk::Timestamp,
}
impl __sdk::InModule for GameDistributionCollection {
type Module = super::RemoteModule;
}
/// Column accessor struct for the table `GameDistributionCollection`.
///
/// Provides typed access to columns for query building.
pub struct GameDistributionCollectionCols {
pub collection_id: __sdk::__query_builder::Col<GameDistributionCollection, String>,
pub user_id: __sdk::__query_builder::Col<GameDistributionCollection, String>,
pub game_id: __sdk::__query_builder::Col<GameDistributionCollection, String>,
pub created_at: __sdk::__query_builder::Col<GameDistributionCollection, __sdk::Timestamp>,
}
impl __sdk::__query_builder::HasCols for GameDistributionCollection {
type Cols = GameDistributionCollectionCols;
fn cols(table_name: &'static str) -> Self::Cols {
GameDistributionCollectionCols {
collection_id: __sdk::__query_builder::Col::new(table_name, "collection_id"),
user_id: __sdk::__query_builder::Col::new(table_name, "user_id"),
game_id: __sdk::__query_builder::Col::new(table_name, "game_id"),
created_at: __sdk::__query_builder::Col::new(table_name, "created_at"),
}
}
}
/// Indexed column accessor struct for the table `GameDistributionCollection`.
///
/// Provides typed access to indexed columns for query building.
pub struct GameDistributionCollectionIxCols {
pub collection_id: __sdk::__query_builder::IxCol<GameDistributionCollection, String>,
pub game_id: __sdk::__query_builder::IxCol<GameDistributionCollection, String>,
pub user_id: __sdk::__query_builder::IxCol<GameDistributionCollection, String>,
}
impl __sdk::__query_builder::HasIxCols for GameDistributionCollection {
type IxCols = GameDistributionCollectionIxCols;
fn ix_cols(table_name: &'static str) -> Self::IxCols {
GameDistributionCollectionIxCols {
collection_id: __sdk::__query_builder::IxCol::new(table_name, "collection_id"),
game_id: __sdk::__query_builder::IxCol::new(table_name, "game_id"),
user_id: __sdk::__query_builder::IxCol::new(table_name, "user_id"),
}
}
}
impl __sdk::__query_builder::CanBeLookupTable for GameDistributionCollection {}
@@ -0,0 +1,16 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct GameDistributionUncollectGameInput {
pub game_id: String,
pub user_id: String,
}
impl __sdk::InModule for GameDistributionUncollectGameInput {
type Module = super::RemoteModule;
}
@@ -0,0 +1,62 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::game_distribution_collection_state_input_type::GameDistributionCollectionStateInput;
use super::game_distribution_collection_state_result_type::GameDistributionCollectionStateResult;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct IsGameDistributionCollectedAndReturnArgs {
pub input: GameDistributionCollectionStateInput,
}
impl __sdk::InModule for IsGameDistributionCollectedAndReturnArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `is_game_distribution_collected_and_return`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait is_game_distribution_collected_and_return {
fn is_game_distribution_collected_and_return(
&self,
input: GameDistributionCollectionStateInput,
) {
self.is_game_distribution_collected_and_return_then(input, |_, _| {});
}
fn is_game_distribution_collected_and_return_then(
&self,
input: GameDistributionCollectionStateInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionStateResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl is_game_distribution_collected_and_return for super::RemoteProcedures {
fn is_game_distribution_collected_and_return_then(
&self,
input: GameDistributionCollectionStateInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionStateResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, GameDistributionCollectionStateResult>(
"is_game_distribution_collected_and_return",
IsGameDistributionCollectedAndReturnArgs { input },
__callback,
);
}
}
@@ -0,0 +1,62 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::game_distribution_collection_list_input_type::GameDistributionCollectionListInput;
use super::game_distribution_collection_list_result_type::GameDistributionCollectionListResult;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct ListGameDistributionCollectionsAndReturnArgs {
pub input: GameDistributionCollectionListInput,
}
impl __sdk::InModule for ListGameDistributionCollectionsAndReturnArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `list_game_distribution_collections_and_return`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait list_game_distribution_collections_and_return {
fn list_game_distribution_collections_and_return(
&self,
input: GameDistributionCollectionListInput,
) {
self.list_game_distribution_collections_and_return_then(input, |_, _| {});
}
fn list_game_distribution_collections_and_return_then(
&self,
input: GameDistributionCollectionListInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionListResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl list_game_distribution_collections_and_return for super::RemoteProcedures {
fn list_game_distribution_collections_and_return_then(
&self,
input: GameDistributionCollectionListInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionListResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, GameDistributionCollectionListResult>(
"list_game_distribution_collections_and_return",
ListGameDistributionCollectionsAndReturnArgs { input },
__callback,
);
}
}
@@ -0,0 +1,59 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::game_distribution_collect_game_input_type::GameDistributionCollectGameInput;
use super::game_distribution_collection_mutation_result_type::GameDistributionCollectionMutationResult;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct SetGameDistributionCollectionAndReturnArgs {
pub input: GameDistributionCollectGameInput,
}
impl __sdk::InModule for SetGameDistributionCollectionAndReturnArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `set_game_distribution_collection_and_return`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait set_game_distribution_collection_and_return {
fn set_game_distribution_collection_and_return(&self, input: GameDistributionCollectGameInput) {
self.set_game_distribution_collection_and_return_then(input, |_, _| {});
}
fn set_game_distribution_collection_and_return_then(
&self,
input: GameDistributionCollectGameInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionMutationResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl set_game_distribution_collection_and_return for super::RemoteProcedures {
fn set_game_distribution_collection_and_return_then(
&self,
input: GameDistributionCollectGameInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionMutationResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, GameDistributionCollectionMutationResult>(
"set_game_distribution_collection_and_return",
SetGameDistributionCollectionAndReturnArgs { input },
__callback,
);
}
}
@@ -0,0 +1,62 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::game_distribution_collection_mutation_result_type::GameDistributionCollectionMutationResult;
use super::game_distribution_uncollect_game_input_type::GameDistributionUncollectGameInput;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct UnsetGameDistributionCollectionAndReturnArgs {
pub input: GameDistributionUncollectGameInput,
}
impl __sdk::InModule for UnsetGameDistributionCollectionAndReturnArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `unset_game_distribution_collection_and_return`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait unset_game_distribution_collection_and_return {
fn unset_game_distribution_collection_and_return(
&self,
input: GameDistributionUncollectGameInput,
) {
self.unset_game_distribution_collection_and_return_then(input, |_, _| {});
}
fn unset_game_distribution_collection_and_return_then(
&self,
input: GameDistributionUncollectGameInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionMutationResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl unset_game_distribution_collection_and_return for super::RemoteProcedures {
fn unset_game_distribution_collection_and_return_then(
&self,
input: GameDistributionUncollectGameInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<GameDistributionCollectionMutationResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, GameDistributionCollectionMutationResult>(
"unset_game_distribution_collection_and_return",
UnsetGameDistributionCollectionAndReturnArgs { input },
__callback,
);
}
}
File diff suppressed because it is too large Load Diff
@@ -222,6 +222,9 @@ macro_rules! migration_tables {
game_distribution_idempotency_receipt,
// 作品之间的改编血缘:业务事实,随迁移导出/导入;父作品下架不删除历史行。
game_distribution_lineage,
// 用户对公开作品的收藏(收录):真实用户态投影,随迁移导出/导入;
// 作品下架不删除行(读取时按当前公开性过滤,重新公开后自动回来)。
game_distribution_collection,
llm_router_account,
llm_router_billing_checkpoint,
agc_model_catalog,