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:
@@ -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",
|
||||
|
||||
+19
@@ -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;
|
||||
}
|
||||
+15
@@ -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;
|
||||
}
|
||||
+19
@@ -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;
|
||||
}
|
||||
+18
@@ -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;
|
||||
}
|
||||
+16
@@ -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;
|
||||
}
|
||||
+17
@@ -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;
|
||||
}
|
||||
+235
@@ -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")
|
||||
}
|
||||
}
|
||||
+62
@@ -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 {}
|
||||
+16
@@ -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;
|
||||
}
|
||||
+62
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
+62
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
+59
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
+62
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user