optimize puzzle gallery access

This commit is contained in:
kdletters
2026-05-16 18:14:00 +08:00
parent 49ffa6b901
commit 7f16e88e57
7 changed files with 508 additions and 101 deletions

View File

@@ -83,6 +83,22 @@
- 验证:运行仓库已有编码检查;人工抽查修改文件中的中文内容。 - 验证:运行仓库已有编码检查;人工抽查修改文件中的中文内容。
- 关联:`AGENTS.md``npm run check:encoding` - 关联:`AGENTS.md``npm run check:encoding`
## SpacetimeDB 运行态查询不要绕过已有索引或用 procedure JSON 回传
- 现象:运行态接口看起来只查当前用户、作品或任务,却在 `spacetime-module` 中使用 `ctx.db.<table>().iter().filter(...)` 整表遍历;或者 procedure result 返回 `items_json/run_json/work_json` 等 JSON 字符串,`spacetime-client` mapper 再反序列化成旧兼容结构。
- 原因:新增索引或 typed snapshot 后,没有同步清理旧 mapper / 测试兼容层,也没有用静态检查拦截回退写法。
- 处理表上已有主键、unique 或 `#[index]` 覆盖查询前缀时,先用对应 accessor `.find(...)` / `.filter(...)`只对索引无法覆盖的条件做内存残余过滤procedure result 返回 typed snapshot / typed value不再跨层传 `*_json: Option<String>` 作为 payload。
- 验证:执行 `npm run check:spacetime-runtime-access``npm run check:server-rs-ddd`,涉及绑定变化时先执行 `npm run spacetime:generate``npm run check:spacetime-schema`
- 关联:`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md``scripts/check-spacetime-runtime-access.mjs``server-rs/crates/spacetime-module/src/*``server-rs/crates/spacetime-client/src/mapper.rs`
## 拼图广场列表不要每次 HTTP 请求调用 SpacetimeDB procedure
- 现象:`/api/runtime/puzzle/gallery` 每个请求都走 `spacetime-client.list_puzzle_gallery()` 调用 SpacetimeDB procedure导致 SpacetimeDB WASM 侧重复组装全量列表,客户端再映射一遍;历史实现还出现过 procedure JSON 字符串往返。
- 原因:`api-server` 的服务器端 `spacetime-client` 没有订阅可公开读取的 gallery 投影,虽然 SDK 支持 client cache但请求路径仍把列表读取当作 procedure 调用。
- 处理:`spacetime-module` 中用 public view `puzzle_gallery_view` 暴露已发布拼图作品;`spacetime-client` 建连接后订阅 `SELECT * FROM puzzle_gallery_view``SELECT * FROM public_work_play_daily_stat WHERE source_type = 'puzzle'` 并等待 `on_applied`HTTP gallery 只从 `connection.db().puzzle_gallery_view().iter()` 本地 cache 读取和排序,再用已同步的 `public_work_play_daily_stat` 在本地聚合 7 日播放数。旧 `list_puzzle_gallery` procedure 只作兼容,不再作为 HTTP gallery 主路径。
- 验证:搜索 `server-rs/crates/spacetime-client/src/puzzle.rs` 不应再出现 gallery 主路径调用 `list_puzzle_gallery_then`;执行 `cargo check --manifest-path server-rs/Cargo.toml -p spacetime-client``cargo check --manifest-path server-rs/Cargo.toml -p api-server` 和 schema/runtime access 检查。
- 关联:`server-rs/crates/spacetime-module/src/puzzle.rs``server-rs/crates/spacetime-client/src/lib.rs``server-rs/crates/spacetime-client/src/puzzle.rs``/api/runtime/puzzle/gallery`
## 忘记密码后仍提示手机号或密码错误先查认证快照同步 ## 忘记密码后仍提示手机号或密码错误先查认证快照同步
- 现象:用户通过“忘记密码”重设密码后,接口返回成功或页面进入登录态,但再次使用新密码登录仍提示“手机号或密码错误”;重启后还可能出现 `Bearer JWT 版本已失效`,日志里的 token version 与本地快照不一致。 - 现象:用户通过“忘记密码”重设密码后,接口返回成功或页面进入登录态,但再次使用新密码登录仍提示“手机号或密码错误”;重启后还可能出现 `Bearer JWT 版本已失效`,日志里的 token version 与本地快照不一致。

View File

@@ -84,14 +84,19 @@ npm run check:server-rs-ddd
## SpacetimeDB schema 变更规则 ## SpacetimeDB schema 变更规则
1. 任何 table、reducer、procedure、row shape 或 bindings 变化,都必须同步 `server-rs/crates/spacetime-module/src/migration.rs`、本文件表目录和生成绑定 1. 任何 table、view、reducer、procedure、row shape 或 bindings 变化,都必须同步本文件表 / view 目录和生成绑定;真实 table 变化还必须同步 `server-rs/crates/spacetime-module/src/migration.rs`view 属于派生投影,不写入迁移导入导出表清单
2. 已有表新增字段必须放在 Rust 表结构体最后,并设置明确 `#[default(...)]` 2. 已有表新增字段必须放在 Rust 表结构体最后,并设置明确 `#[default(...)]`
3. 删除字段、改名、重排字段、改类型或修改字段属性前,必须先询问用户并确认迁移计划。 3. 删除字段、改名、重排字段、改类型或修改字段属性前,必须先询问用户并确认迁移计划。
4. Vec 字段不要直接写无法 const 求值的 default需要默认空集合时优先使用 `Option<Vec<T>>``#[default(None::<Vec<T>>)]`,业务层归一为空数组。 4. Vec 字段不要直接写无法 const 求值的 default需要默认空集合时优先使用 `Option<Vec<T>>``#[default(None::<Vec<T>>)]`,业务层归一为空数组。
5. 修改后运行: 5. 运行态读表必须按已声明索引访问。只要 table 上存在覆盖查询前缀的 `#[index(...)]` 或主键 / unique accessor列表、详情、快照组装和计数都先用对应 accessor `.filter(...)` / `.find(...)`,再在内存中处理索引无法覆盖的残余条件;不得用 `.iter().filter(...)` 扫整表替代现成索引。
6. 面向公开列表的只读投影优先做成 public view并由 `api-server``spacetime-client` 长期订阅后读本地 cache。不要让 HTTP 列表接口每次请求都调用 procedure 重新组装全量列表;需要请求时间窗口的轻量统计可订阅公开统计表后在 `api-server` 本地聚合,需要写入副作用的详情、点赞、游玩记录仍可走 procedure / reducer。
7. 多列索引按 SpacetimeDB 绑定生成的元组参数直接传入,例如 `.filter((source_type, profile_id, played_day))`;前缀查询只传前缀元组,例如 `.filter((scope_kind, scope_id.as_str()))`。不要为了绕过类型问题退回整表遍历。
8. procedure result 必须返回 typed snapshot / typed value。`spacetime-client` mapper 不得再通过 `row_json/session_json/work_json/items_json/run_json/event_json/feedback_json: Option<String>` 做跨层 JSON 字符串传输,也不得在 mapper 里反序列化旧 `*JsonRecord` 兼容结构。业务内部持久化字段如 `profile_payload_json``levels_json` 等不属于 procedure result 载荷例外,仍按各自表契约处理。
9. 修改后运行:
```bash ```bash
npm run spacetime:generate npm run spacetime:generate
npm run check:spacetime-runtime-access
npm run check:spacetime-schema npm run check:spacetime-schema
npm run check:server-rs-ddd npm run check:server-rs-ddd
``` ```
@@ -460,6 +465,13 @@ npm run check:server-rs-ddd
- Rust 结构体:`PuzzleWorkProfileRow` - Rust 结构体:`PuzzleWorkProfileRow`
- 源码:`server-rs/crates/spacetime-module/src/puzzle.rs` - 源码:`server-rs/crates/spacetime-module/src/puzzle.rs`
### `puzzle_gallery_view`
- Rust view`puzzle_gallery_view`
- 返回类型:`Vec<PuzzleWorkProfile>`
- 源码:`server-rs/crates/spacetime-module/src/puzzle.rs`
- 说明:拼图广场公开列表投影,只暴露 `publication_status = Published` 的作品;`api-server``spacetime-client` 长期订阅 `SELECT * FROM puzzle_gallery_view``SELECT * FROM public_work_play_daily_stat WHERE source_type = 'puzzle'` 后,从本地 cache 构造 `/api/runtime/puzzle/gallery` 响应,并在本地按当前请求时间聚合 `recentPlayCount7d`,不再每个 HTTP 请求调用 `list_puzzle_gallery` procedure。
### `quest_log` ### `quest_log`
- Rust 结构体:`QuestLog` - Rust 结构体:`QuestLog`

View File

@@ -142,24 +142,6 @@ use module_npc::{
NpcStanceProfile as DomainNpcStanceProfile, NpcStateSnapshot as DomainNpcStateSnapshot, NpcStanceProfile as DomainNpcStanceProfile, NpcStateSnapshot as DomainNpcStateSnapshot,
ResolveNpcInteractionInput as DomainResolveNpcInteractionInput, ResolveNpcInteractionInput as DomainResolveNpcInteractionInput,
}; };
use module_puzzle::{
PuzzleAgentMessageSnapshot as DomainPuzzleAgentMessageSnapshot,
PuzzleAgentSessionSnapshot as DomainPuzzleAgentSessionSnapshot,
PuzzleAgentSuggestedAction as DomainPuzzleAgentSuggestedAction,
PuzzleAnchorItem as DomainPuzzleAnchorItem, PuzzleAnchorPack as DomainPuzzleAnchorPack,
PuzzleBoardSnapshot as DomainPuzzleBoardSnapshot,
PuzzleCellPosition as DomainPuzzleCellPosition,
PuzzleCreatorIntent as DomainPuzzleCreatorIntent, PuzzleDraftLevel as DomainPuzzleDraftLevel,
PuzzleGeneratedImageCandidate as DomainPuzzleGeneratedImageCandidate,
PuzzleMergedGroupState as DomainPuzzleMergedGroupState,
PuzzlePieceState as DomainPuzzlePieceState, PuzzleResultDraft as DomainPuzzleResultDraft,
PuzzleResultPreviewBlocker as DomainPuzzleResultPreviewBlocker,
PuzzleResultPreviewEnvelope as DomainPuzzleResultPreviewEnvelope,
PuzzleResultPreviewFinding as DomainPuzzleResultPreviewFinding,
PuzzleRunSnapshot as DomainPuzzleRunSnapshot,
PuzzleRuntimeLevelSnapshot as DomainPuzzleRuntimeLevelSnapshot,
PuzzleWorkProfile as DomainPuzzleWorkProfile,
};
use module_runtime::{ use module_runtime::{
AnalyticsMetricQueryResponse as DomainAnalyticsMetricQueryResponse, RuntimeBrowseHistoryRecord, AnalyticsMetricQueryResponse as DomainAnalyticsMetricQueryResponse, RuntimeBrowseHistoryRecord,
RuntimePlatformTheme as DomainRuntimePlatformTheme, RuntimeProfileDashboardRecord, RuntimePlatformTheme as DomainRuntimePlatformTheme, RuntimeProfileDashboardRecord,
@@ -222,7 +204,7 @@ use module_story::{
build_story_continue_input, build_story_session_input, build_story_session_state_input, build_story_continue_input, build_story_session_input, build_story_session_state_input,
}; };
use shared_kernel::format_timestamp_micros; use shared_kernel::format_timestamp_micros;
use spacetimedb_sdk::DbContext; use spacetimedb_sdk::{DbContext, Table};
use tokio::{ use tokio::{
sync::{OwnedSemaphorePermit, Semaphore, oneshot}, sync::{OwnedSemaphorePermit, Semaphore, oneshot},
time::timeout, time::timeout,
@@ -285,6 +267,7 @@ struct PooledConnectionSlot {
struct PooledConnection { struct PooledConnection {
connection: DbConnection, connection: DbConnection,
_gallery_subscription: Vec<SubscriptionHandle>,
runner: Option<JoinHandle<()>>, runner: Option<JoinHandle<()>>,
broken: Arc<AtomicBool>, broken: Arc<AtomicBool>,
} }
@@ -377,6 +360,26 @@ impl SpacetimeClient {
final_result final_result
} }
async fn read_after_connect<T>(
&self,
read: impl FnOnce(&DbConnection) -> Result<T, SpacetimeClientError> + Send + 'static,
) -> Result<T, SpacetimeClientError>
where
T: Send + 'static,
{
let lease = self.acquire_connection().await?;
let final_result = if let Some(connection) = lease.connection.as_ref() {
read(&connection.connection)
} else {
Err(SpacetimeClientError::Runtime(
"SpacetimeDB 连接租约缺少连接".to_string(),
))
};
self.release_connection(lease).await;
final_result
}
async fn acquire_connection(&self) -> Result<PooledConnectionLease, SpacetimeClientError> { async fn acquire_connection(&self) -> Result<PooledConnectionLease, SpacetimeClientError> {
let permit = timeout( let permit = timeout(
self.config.procedure_timeout, self.config.procedure_timeout,
@@ -465,13 +468,58 @@ impl SpacetimeClient {
.map_err(|_| SpacetimeClientError::Timeout)? .map_err(|_| SpacetimeClientError::Timeout)?
.map_err(|_| SpacetimeClientError::ConnectDropped)??; .map_err(|_| SpacetimeClientError::ConnectDropped)??;
let gallery_subscription = self
.subscribe_puzzle_gallery_views(&connection, broken.clone())
.await?;
Ok(PooledConnection { Ok(PooledConnection {
connection, connection,
_gallery_subscription: gallery_subscription,
runner: Some(runner), runner: Some(runner),
broken, broken,
}) })
} }
async fn subscribe_puzzle_gallery_views(
&self,
connection: &DbConnection,
broken: Arc<AtomicBool>,
) -> Result<Vec<SubscriptionHandle>, SpacetimeClientError> {
let mut subscriptions = Vec::new();
for query in [
"SELECT * FROM puzzle_gallery_view",
"SELECT * FROM public_work_play_daily_stat WHERE source_type = 'puzzle'",
] {
let (sender, receiver) = oneshot::channel::<Result<(), SpacetimeClientError>>();
let applied_sender = Arc::new(Mutex::new(Some(sender)));
let on_applied_sender = applied_sender.clone();
let on_error_sender = applied_sender.clone();
let broken_flag = broken.clone();
let subscription = connection
.subscription_builder()
.on_applied(move |_| {
send_connect_once(&on_applied_sender, Ok(()));
})
.on_error(move |_, error| {
broken_flag.store(true, Ordering::SeqCst);
send_connect_once(
&on_error_sender,
Err(SpacetimeClientError::Procedure(error.to_string())),
);
})
.subscribe(query);
timeout(self.config.procedure_timeout, receiver)
.await
.map_err(|_| SpacetimeClientError::Timeout)?
.map_err(|_| SpacetimeClientError::ConnectDropped)??;
subscriptions.push(subscription);
}
Ok(subscriptions)
}
async fn release_connection(&self, mut lease: PooledConnectionLease) { async fn release_connection(&self, mut lease: PooledConnectionLease) {
let mut slot_guard = self.pool.slots[lease.slot_index].lock().await; let mut slot_guard = self.pool.slots[lease.slot_index].lock().await;
slot_guard.in_use = false; slot_guard.in_use = false;

View File

@@ -95,6 +95,7 @@ pub mod auth_store_snapshot_type;
pub mod auth_store_snapshot_upsert_input_type; pub mod auth_store_snapshot_upsert_input_type;
pub mod authorize_database_migration_operator_procedure; pub mod authorize_database_migration_operator_procedure;
pub mod bark_battle_draft_config_row_type; pub mod bark_battle_draft_config_row_type;
pub mod bark_battle_draft_config_snapshot_type;
pub mod bark_battle_draft_config_table; pub mod bark_battle_draft_config_table;
pub mod bark_battle_draft_config_upsert_input_type; pub mod bark_battle_draft_config_upsert_input_type;
pub mod bark_battle_draft_create_input_type; pub mod bark_battle_draft_create_input_type;
@@ -107,8 +108,10 @@ pub mod bark_battle_published_config_row_type;
pub mod bark_battle_published_config_table; pub mod bark_battle_published_config_table;
pub mod bark_battle_run_finish_input_type; pub mod bark_battle_run_finish_input_type;
pub mod bark_battle_run_get_input_type; pub mod bark_battle_run_get_input_type;
pub mod bark_battle_run_snapshot_type;
pub mod bark_battle_run_start_input_type; pub mod bark_battle_run_start_input_type;
pub mod bark_battle_runtime_config_get_input_type; pub mod bark_battle_runtime_config_get_input_type;
pub mod bark_battle_runtime_config_snapshot_type;
pub mod bark_battle_runtime_run_row_type; pub mod bark_battle_runtime_run_row_type;
pub mod bark_battle_runtime_run_table; pub mod bark_battle_runtime_run_table;
pub mod bark_battle_score_record_row_type; pub mod bark_battle_score_record_row_type;
@@ -160,16 +163,20 @@ pub mod big_fish_run_get_input_type;
pub mod big_fish_run_procedure_result_type; pub mod big_fish_run_procedure_result_type;
pub mod big_fish_run_start_input_type; pub mod big_fish_run_start_input_type;
pub mod big_fish_run_status_type; pub mod big_fish_run_status_type;
pub mod big_fish_runtime_entity_snapshot_type;
pub mod big_fish_runtime_params_type; pub mod big_fish_runtime_params_type;
pub mod big_fish_runtime_run_table; pub mod big_fish_runtime_run_table;
pub mod big_fish_runtime_run_type; pub mod big_fish_runtime_run_type;
pub mod big_fish_runtime_snapshot_type;
pub mod big_fish_session_create_input_type; pub mod big_fish_session_create_input_type;
pub mod big_fish_session_get_input_type; pub mod big_fish_session_get_input_type;
pub mod big_fish_session_procedure_result_type; pub mod big_fish_session_procedure_result_type;
pub mod big_fish_session_snapshot_type; pub mod big_fish_session_snapshot_type;
pub mod big_fish_vector_2_type;
pub mod big_fish_work_delete_input_type; pub mod big_fish_work_delete_input_type;
pub mod big_fish_work_like_record_input_type; pub mod big_fish_work_like_record_input_type;
pub mod big_fish_work_remix_input_type; pub mod big_fish_work_remix_input_type;
pub mod big_fish_work_summary_snapshot_type;
pub mod big_fish_works_list_input_type; pub mod big_fish_works_list_input_type;
pub mod big_fish_works_procedure_result_type; pub mod big_fish_works_procedure_result_type;
pub mod bind_asset_object_to_entity_and_return_procedure; pub mod bind_asset_object_to_entity_and_return_procedure;
@@ -402,30 +409,38 @@ pub mod list_visual_novel_works_procedure;
pub mod mark_profile_recharge_order_paid_and_return_procedure; pub mod mark_profile_recharge_order_paid_and_return_procedure;
pub mod match_3_d_agent_message_finalize_input_type; pub mod match_3_d_agent_message_finalize_input_type;
pub mod match_3_d_agent_message_row_type; pub mod match_3_d_agent_message_row_type;
pub mod match_3_d_agent_message_snapshot_type;
pub mod match_3_d_agent_message_submit_input_type; pub mod match_3_d_agent_message_submit_input_type;
pub mod match_3_d_agent_message_table; pub mod match_3_d_agent_message_table;
pub mod match_3_d_agent_session_create_input_type; pub mod match_3_d_agent_session_create_input_type;
pub mod match_3_d_agent_session_get_input_type; pub mod match_3_d_agent_session_get_input_type;
pub mod match_3_d_agent_session_procedure_result_type; pub mod match_3_d_agent_session_procedure_result_type;
pub mod match_3_d_agent_session_row_type; pub mod match_3_d_agent_session_row_type;
pub mod match_3_d_agent_session_snapshot_type;
pub mod match_3_d_agent_session_table; pub mod match_3_d_agent_session_table;
pub mod match_3_d_click_item_procedure_result_type; pub mod match_3_d_click_item_procedure_result_type;
pub mod match_3_d_creator_config_snapshot_type;
pub mod match_3_d_draft_compile_input_type; pub mod match_3_d_draft_compile_input_type;
pub mod match_3_d_draft_snapshot_type;
pub mod match_3_d_item_snapshot_type;
pub mod match_3_d_run_click_input_type; pub mod match_3_d_run_click_input_type;
pub mod match_3_d_run_get_input_type; pub mod match_3_d_run_get_input_type;
pub mod match_3_d_run_procedure_result_type; pub mod match_3_d_run_procedure_result_type;
pub mod match_3_d_run_restart_input_type; pub mod match_3_d_run_restart_input_type;
pub mod match_3_d_run_snapshot_type;
pub mod match_3_d_run_start_input_type; pub mod match_3_d_run_start_input_type;
pub mod match_3_d_run_stop_input_type; pub mod match_3_d_run_stop_input_type;
pub mod match_3_d_run_time_up_input_type; pub mod match_3_d_run_time_up_input_type;
pub mod match_3_d_runtime_run_row_type; pub mod match_3_d_runtime_run_row_type;
pub mod match_3_d_runtime_run_table; pub mod match_3_d_runtime_run_table;
pub mod match_3_d_tray_slot_snapshot_type;
pub mod match_3_d_work_delete_input_type; pub mod match_3_d_work_delete_input_type;
pub mod match_3_d_work_get_input_type; pub mod match_3_d_work_get_input_type;
pub mod match_3_d_work_procedure_result_type; pub mod match_3_d_work_procedure_result_type;
pub mod match_3_d_work_profile_row_type; pub mod match_3_d_work_profile_row_type;
pub mod match_3_d_work_profile_table; pub mod match_3_d_work_profile_table;
pub mod match_3_d_work_publish_input_type; pub mod match_3_d_work_publish_input_type;
pub mod match_3_d_work_snapshot_type;
pub mod match_3_d_work_update_input_type; pub mod match_3_d_work_update_input_type;
pub mod match_3_d_works_list_input_type; pub mod match_3_d_works_list_input_type;
pub mod match_3_d_works_procedure_result_type; pub mod match_3_d_works_procedure_result_type;
@@ -499,33 +514,58 @@ pub mod puzzle_agent_message_finalize_input_type;
pub mod puzzle_agent_message_kind_type; pub mod puzzle_agent_message_kind_type;
pub mod puzzle_agent_message_role_type; pub mod puzzle_agent_message_role_type;
pub mod puzzle_agent_message_row_type; pub mod puzzle_agent_message_row_type;
pub mod puzzle_agent_message_snapshot_type;
pub mod puzzle_agent_message_submit_input_type; pub mod puzzle_agent_message_submit_input_type;
pub mod puzzle_agent_message_table; pub mod puzzle_agent_message_table;
pub mod puzzle_agent_session_create_input_type; pub mod puzzle_agent_session_create_input_type;
pub mod puzzle_agent_session_get_input_type; pub mod puzzle_agent_session_get_input_type;
pub mod puzzle_agent_session_procedure_result_type; pub mod puzzle_agent_session_procedure_result_type;
pub mod puzzle_agent_session_row_type; pub mod puzzle_agent_session_row_type;
pub mod puzzle_agent_session_snapshot_type;
pub mod puzzle_agent_session_table; pub mod puzzle_agent_session_table;
pub mod puzzle_agent_stage_type; pub mod puzzle_agent_stage_type;
pub mod puzzle_agent_suggested_action_type;
pub mod puzzle_anchor_item_type;
pub mod puzzle_anchor_pack_type;
pub mod puzzle_anchor_status_type;
pub mod puzzle_audio_asset_type;
pub mod puzzle_board_snapshot_type;
pub mod puzzle_cell_position_type;
pub mod puzzle_creator_intent_type;
pub mod puzzle_draft_compile_input_type; pub mod puzzle_draft_compile_input_type;
pub mod puzzle_draft_level_type;
pub mod puzzle_event_kind_type; pub mod puzzle_event_kind_type;
pub mod puzzle_event_table; pub mod puzzle_event_table;
pub mod puzzle_event_type; pub mod puzzle_event_type;
pub mod puzzle_form_draft_save_input_type; pub mod puzzle_form_draft_save_input_type;
pub mod puzzle_form_draft_type;
pub mod puzzle_gallery_view_table;
pub mod puzzle_generated_image_candidate_type;
pub mod puzzle_generated_images_save_input_type; pub mod puzzle_generated_images_save_input_type;
pub mod puzzle_leaderboard_entry_row_type; pub mod puzzle_leaderboard_entry_row_type;
pub mod puzzle_leaderboard_entry_table; pub mod puzzle_leaderboard_entry_table;
pub mod puzzle_leaderboard_entry_type;
pub mod puzzle_leaderboard_submit_input_type; pub mod puzzle_leaderboard_submit_input_type;
pub mod puzzle_merged_group_state_type;
pub mod puzzle_piece_state_type;
pub mod puzzle_publication_status_type; pub mod puzzle_publication_status_type;
pub mod puzzle_publish_input_type; pub mod puzzle_publish_input_type;
pub mod puzzle_recommended_next_work_type;
pub mod puzzle_result_draft_type;
pub mod puzzle_result_preview_blocker_type;
pub mod puzzle_result_preview_envelope_type;
pub mod puzzle_result_preview_finding_type;
pub mod puzzle_run_drag_input_type; pub mod puzzle_run_drag_input_type;
pub mod puzzle_run_get_input_type; pub mod puzzle_run_get_input_type;
pub mod puzzle_run_next_level_input_type; pub mod puzzle_run_next_level_input_type;
pub mod puzzle_run_pause_input_type; pub mod puzzle_run_pause_input_type;
pub mod puzzle_run_procedure_result_type; pub mod puzzle_run_procedure_result_type;
pub mod puzzle_run_prop_input_type; pub mod puzzle_run_prop_input_type;
pub mod puzzle_run_snapshot_type;
pub mod puzzle_run_start_input_type; pub mod puzzle_run_start_input_type;
pub mod puzzle_run_swap_input_type; pub mod puzzle_run_swap_input_type;
pub mod puzzle_runtime_level_snapshot_type;
pub mod puzzle_runtime_level_status_type;
pub mod puzzle_runtime_run_row_type; pub mod puzzle_runtime_run_row_type;
pub mod puzzle_runtime_run_table; pub mod puzzle_runtime_run_table;
pub mod puzzle_select_cover_image_input_type; pub mod puzzle_select_cover_image_input_type;
@@ -537,6 +577,7 @@ pub mod puzzle_work_point_incentive_claim_input_type;
pub mod puzzle_work_procedure_result_type; pub mod puzzle_work_procedure_result_type;
pub mod puzzle_work_profile_row_type; pub mod puzzle_work_profile_row_type;
pub mod puzzle_work_profile_table; pub mod puzzle_work_profile_table;
pub mod puzzle_work_profile_type;
pub mod puzzle_work_remix_input_type; pub mod puzzle_work_remix_input_type;
pub mod puzzle_work_upsert_input_type; pub mod puzzle_work_upsert_input_type;
pub mod puzzle_works_list_input_type; pub mod puzzle_works_list_input_type;
@@ -728,30 +769,41 @@ pub mod seed_analytics_date_dimensions_reducer;
pub mod select_puzzle_cover_image_procedure; pub mod select_puzzle_cover_image_procedure;
pub mod square_hole_agent_message_finalize_input_type; pub mod square_hole_agent_message_finalize_input_type;
pub mod square_hole_agent_message_row_type; pub mod square_hole_agent_message_row_type;
pub mod square_hole_agent_message_snapshot_type;
pub mod square_hole_agent_message_submit_input_type; pub mod square_hole_agent_message_submit_input_type;
pub mod square_hole_agent_message_table; pub mod square_hole_agent_message_table;
pub mod square_hole_agent_session_create_input_type; pub mod square_hole_agent_session_create_input_type;
pub mod square_hole_agent_session_get_input_type; pub mod square_hole_agent_session_get_input_type;
pub mod square_hole_agent_session_procedure_result_type; pub mod square_hole_agent_session_procedure_result_type;
pub mod square_hole_agent_session_row_type; pub mod square_hole_agent_session_row_type;
pub mod square_hole_agent_session_snapshot_type;
pub mod square_hole_agent_session_table; pub mod square_hole_agent_session_table;
pub mod square_hole_creator_config_snapshot_type;
pub mod square_hole_draft_compile_input_type; pub mod square_hole_draft_compile_input_type;
pub mod square_hole_draft_snapshot_type;
pub mod square_hole_drop_feedback_snapshot_type;
pub mod square_hole_drop_shape_procedure_result_type; pub mod square_hole_drop_shape_procedure_result_type;
pub mod square_hole_hole_option_snapshot_type;
pub mod square_hole_hole_snapshot_type;
pub mod square_hole_run_drop_input_type; pub mod square_hole_run_drop_input_type;
pub mod square_hole_run_get_input_type; pub mod square_hole_run_get_input_type;
pub mod square_hole_run_procedure_result_type; pub mod square_hole_run_procedure_result_type;
pub mod square_hole_run_restart_input_type; pub mod square_hole_run_restart_input_type;
pub mod square_hole_run_snapshot_type;
pub mod square_hole_run_start_input_type; pub mod square_hole_run_start_input_type;
pub mod square_hole_run_stop_input_type; pub mod square_hole_run_stop_input_type;
pub mod square_hole_run_time_up_input_type; pub mod square_hole_run_time_up_input_type;
pub mod square_hole_runtime_run_row_type; pub mod square_hole_runtime_run_row_type;
pub mod square_hole_runtime_run_table; pub mod square_hole_runtime_run_table;
pub mod square_hole_shape_option_snapshot_type;
pub mod square_hole_shape_snapshot_type;
pub mod square_hole_work_delete_input_type; pub mod square_hole_work_delete_input_type;
pub mod square_hole_work_get_input_type; pub mod square_hole_work_get_input_type;
pub mod square_hole_work_procedure_result_type; pub mod square_hole_work_procedure_result_type;
pub mod square_hole_work_profile_row_type; pub mod square_hole_work_profile_row_type;
pub mod square_hole_work_profile_table; pub mod square_hole_work_profile_table;
pub mod square_hole_work_publish_input_type; pub mod square_hole_work_publish_input_type;
pub mod square_hole_work_snapshot_type;
pub mod square_hole_work_update_input_type; pub mod square_hole_work_update_input_type;
pub mod square_hole_works_list_input_type; pub mod square_hole_works_list_input_type;
pub mod square_hole_works_procedure_result_type; pub mod square_hole_works_procedure_result_type;
@@ -828,24 +880,31 @@ pub mod user_browse_history_table;
pub mod user_browse_history_type; pub mod user_browse_history_type;
pub mod visual_novel_agent_message_finalize_input_type; pub mod visual_novel_agent_message_finalize_input_type;
pub mod visual_novel_agent_message_row_type; pub mod visual_novel_agent_message_row_type;
pub mod visual_novel_agent_message_snapshot_type;
pub mod visual_novel_agent_message_submit_input_type; pub mod visual_novel_agent_message_submit_input_type;
pub mod visual_novel_agent_message_table; pub mod visual_novel_agent_message_table;
pub mod visual_novel_agent_session_create_input_type; pub mod visual_novel_agent_session_create_input_type;
pub mod visual_novel_agent_session_get_input_type; pub mod visual_novel_agent_session_get_input_type;
pub mod visual_novel_agent_session_procedure_result_type; pub mod visual_novel_agent_session_procedure_result_type;
pub mod visual_novel_agent_session_row_type; pub mod visual_novel_agent_session_row_type;
pub mod visual_novel_agent_session_snapshot_type;
pub mod visual_novel_agent_session_table; pub mod visual_novel_agent_session_table;
pub mod visual_novel_history_procedure_result_type; pub mod visual_novel_history_procedure_result_type;
pub mod visual_novel_json_field_type;
pub mod visual_novel_json_value_type;
pub mod visual_novel_run_get_input_type; pub mod visual_novel_run_get_input_type;
pub mod visual_novel_run_procedure_result_type; pub mod visual_novel_run_procedure_result_type;
pub mod visual_novel_run_snapshot_type;
pub mod visual_novel_run_snapshot_upsert_input_type; pub mod visual_novel_run_snapshot_upsert_input_type;
pub mod visual_novel_run_start_input_type; pub mod visual_novel_run_start_input_type;
pub mod visual_novel_runtime_event_procedure_result_type; pub mod visual_novel_runtime_event_procedure_result_type;
pub mod visual_novel_runtime_event_record_input_type; pub mod visual_novel_runtime_event_record_input_type;
pub mod visual_novel_runtime_event_snapshot_type;
pub mod visual_novel_runtime_event_table; pub mod visual_novel_runtime_event_table;
pub mod visual_novel_runtime_event_type; pub mod visual_novel_runtime_event_type;
pub mod visual_novel_runtime_history_append_input_type; pub mod visual_novel_runtime_history_append_input_type;
pub mod visual_novel_runtime_history_entry_row_type; pub mod visual_novel_runtime_history_entry_row_type;
pub mod visual_novel_runtime_history_entry_snapshot_type;
pub mod visual_novel_runtime_history_entry_table; pub mod visual_novel_runtime_history_entry_table;
pub mod visual_novel_runtime_history_list_input_type; pub mod visual_novel_runtime_history_list_input_type;
pub mod visual_novel_runtime_run_row_type; pub mod visual_novel_runtime_run_row_type;
@@ -857,6 +916,7 @@ pub mod visual_novel_work_procedure_result_type;
pub mod visual_novel_work_profile_row_type; pub mod visual_novel_work_profile_row_type;
pub mod visual_novel_work_profile_table; pub mod visual_novel_work_profile_table;
pub mod visual_novel_work_publish_input_type; pub mod visual_novel_work_publish_input_type;
pub mod visual_novel_work_snapshot_type;
pub mod visual_novel_work_update_input_type; pub mod visual_novel_work_update_input_type;
pub mod visual_novel_works_list_input_type; pub mod visual_novel_works_list_input_type;
pub mod visual_novel_works_procedure_result_type; pub mod visual_novel_works_procedure_result_type;
@@ -950,6 +1010,7 @@ pub use auth_store_snapshot_type::AuthStoreSnapshot;
pub use auth_store_snapshot_upsert_input_type::AuthStoreSnapshotUpsertInput; pub use auth_store_snapshot_upsert_input_type::AuthStoreSnapshotUpsertInput;
pub use authorize_database_migration_operator_procedure::authorize_database_migration_operator; pub use authorize_database_migration_operator_procedure::authorize_database_migration_operator;
pub use bark_battle_draft_config_row_type::BarkBattleDraftConfigRow; pub use bark_battle_draft_config_row_type::BarkBattleDraftConfigRow;
pub use bark_battle_draft_config_snapshot_type::BarkBattleDraftConfigSnapshot;
pub use bark_battle_draft_config_table::*; pub use bark_battle_draft_config_table::*;
pub use bark_battle_draft_config_upsert_input_type::BarkBattleDraftConfigUpsertInput; pub use bark_battle_draft_config_upsert_input_type::BarkBattleDraftConfigUpsertInput;
pub use bark_battle_draft_create_input_type::BarkBattleDraftCreateInput; pub use bark_battle_draft_create_input_type::BarkBattleDraftCreateInput;
@@ -962,8 +1023,10 @@ pub use bark_battle_published_config_row_type::BarkBattlePublishedConfigRow;
pub use bark_battle_published_config_table::*; pub use bark_battle_published_config_table::*;
pub use bark_battle_run_finish_input_type::BarkBattleRunFinishInput; pub use bark_battle_run_finish_input_type::BarkBattleRunFinishInput;
pub use bark_battle_run_get_input_type::BarkBattleRunGetInput; pub use bark_battle_run_get_input_type::BarkBattleRunGetInput;
pub use bark_battle_run_snapshot_type::BarkBattleRunSnapshot;
pub use bark_battle_run_start_input_type::BarkBattleRunStartInput; pub use bark_battle_run_start_input_type::BarkBattleRunStartInput;
pub use bark_battle_runtime_config_get_input_type::BarkBattleRuntimeConfigGetInput; pub use bark_battle_runtime_config_get_input_type::BarkBattleRuntimeConfigGetInput;
pub use bark_battle_runtime_config_snapshot_type::BarkBattleRuntimeConfigSnapshot;
pub use bark_battle_runtime_run_row_type::BarkBattleRuntimeRunRow; pub use bark_battle_runtime_run_row_type::BarkBattleRuntimeRunRow;
pub use bark_battle_runtime_run_table::*; pub use bark_battle_runtime_run_table::*;
pub use bark_battle_score_record_row_type::BarkBattleScoreRecordRow; pub use bark_battle_score_record_row_type::BarkBattleScoreRecordRow;
@@ -1015,16 +1078,20 @@ pub use big_fish_run_get_input_type::BigFishRunGetInput;
pub use big_fish_run_procedure_result_type::BigFishRunProcedureResult; pub use big_fish_run_procedure_result_type::BigFishRunProcedureResult;
pub use big_fish_run_start_input_type::BigFishRunStartInput; pub use big_fish_run_start_input_type::BigFishRunStartInput;
pub use big_fish_run_status_type::BigFishRunStatus; pub use big_fish_run_status_type::BigFishRunStatus;
pub use big_fish_runtime_entity_snapshot_type::BigFishRuntimeEntitySnapshot;
pub use big_fish_runtime_params_type::BigFishRuntimeParams; pub use big_fish_runtime_params_type::BigFishRuntimeParams;
pub use big_fish_runtime_run_table::*; pub use big_fish_runtime_run_table::*;
pub use big_fish_runtime_run_type::BigFishRuntimeRun; pub use big_fish_runtime_run_type::BigFishRuntimeRun;
pub use big_fish_runtime_snapshot_type::BigFishRuntimeSnapshot;
pub use big_fish_session_create_input_type::BigFishSessionCreateInput; pub use big_fish_session_create_input_type::BigFishSessionCreateInput;
pub use big_fish_session_get_input_type::BigFishSessionGetInput; pub use big_fish_session_get_input_type::BigFishSessionGetInput;
pub use big_fish_session_procedure_result_type::BigFishSessionProcedureResult; pub use big_fish_session_procedure_result_type::BigFishSessionProcedureResult;
pub use big_fish_session_snapshot_type::BigFishSessionSnapshot; pub use big_fish_session_snapshot_type::BigFishSessionSnapshot;
pub use big_fish_vector_2_type::BigFishVector2;
pub use big_fish_work_delete_input_type::BigFishWorkDeleteInput; pub use big_fish_work_delete_input_type::BigFishWorkDeleteInput;
pub use big_fish_work_like_record_input_type::BigFishWorkLikeRecordInput; pub use big_fish_work_like_record_input_type::BigFishWorkLikeRecordInput;
pub use big_fish_work_remix_input_type::BigFishWorkRemixInput; pub use big_fish_work_remix_input_type::BigFishWorkRemixInput;
pub use big_fish_work_summary_snapshot_type::BigFishWorkSummarySnapshot;
pub use big_fish_works_list_input_type::BigFishWorksListInput; pub use big_fish_works_list_input_type::BigFishWorksListInput;
pub use big_fish_works_procedure_result_type::BigFishWorksProcedureResult; pub use big_fish_works_procedure_result_type::BigFishWorksProcedureResult;
pub use bind_asset_object_to_entity_and_return_procedure::bind_asset_object_to_entity_and_return; pub use bind_asset_object_to_entity_and_return_procedure::bind_asset_object_to_entity_and_return;
@@ -1257,30 +1324,38 @@ pub use list_visual_novel_works_procedure::list_visual_novel_works;
pub use mark_profile_recharge_order_paid_and_return_procedure::mark_profile_recharge_order_paid_and_return; pub use mark_profile_recharge_order_paid_and_return_procedure::mark_profile_recharge_order_paid_and_return;
pub use match_3_d_agent_message_finalize_input_type::Match3DAgentMessageFinalizeInput; pub use match_3_d_agent_message_finalize_input_type::Match3DAgentMessageFinalizeInput;
pub use match_3_d_agent_message_row_type::Match3DAgentMessageRow; pub use match_3_d_agent_message_row_type::Match3DAgentMessageRow;
pub use match_3_d_agent_message_snapshot_type::Match3DAgentMessageSnapshot;
pub use match_3_d_agent_message_submit_input_type::Match3DAgentMessageSubmitInput; pub use match_3_d_agent_message_submit_input_type::Match3DAgentMessageSubmitInput;
pub use match_3_d_agent_message_table::*; pub use match_3_d_agent_message_table::*;
pub use match_3_d_agent_session_create_input_type::Match3DAgentSessionCreateInput; pub use match_3_d_agent_session_create_input_type::Match3DAgentSessionCreateInput;
pub use match_3_d_agent_session_get_input_type::Match3DAgentSessionGetInput; pub use match_3_d_agent_session_get_input_type::Match3DAgentSessionGetInput;
pub use match_3_d_agent_session_procedure_result_type::Match3DAgentSessionProcedureResult; pub use match_3_d_agent_session_procedure_result_type::Match3DAgentSessionProcedureResult;
pub use match_3_d_agent_session_row_type::Match3DAgentSessionRow; pub use match_3_d_agent_session_row_type::Match3DAgentSessionRow;
pub use match_3_d_agent_session_snapshot_type::Match3DAgentSessionSnapshot;
pub use match_3_d_agent_session_table::*; pub use match_3_d_agent_session_table::*;
pub use match_3_d_click_item_procedure_result_type::Match3DClickItemProcedureResult; pub use match_3_d_click_item_procedure_result_type::Match3DClickItemProcedureResult;
pub use match_3_d_creator_config_snapshot_type::Match3DCreatorConfigSnapshot;
pub use match_3_d_draft_compile_input_type::Match3DDraftCompileInput; pub use match_3_d_draft_compile_input_type::Match3DDraftCompileInput;
pub use match_3_d_draft_snapshot_type::Match3DDraftSnapshot;
pub use match_3_d_item_snapshot_type::Match3DItemSnapshot;
pub use match_3_d_run_click_input_type::Match3DRunClickInput; pub use match_3_d_run_click_input_type::Match3DRunClickInput;
pub use match_3_d_run_get_input_type::Match3DRunGetInput; pub use match_3_d_run_get_input_type::Match3DRunGetInput;
pub use match_3_d_run_procedure_result_type::Match3DRunProcedureResult; pub use match_3_d_run_procedure_result_type::Match3DRunProcedureResult;
pub use match_3_d_run_restart_input_type::Match3DRunRestartInput; pub use match_3_d_run_restart_input_type::Match3DRunRestartInput;
pub use match_3_d_run_snapshot_type::Match3DRunSnapshot;
pub use match_3_d_run_start_input_type::Match3DRunStartInput; pub use match_3_d_run_start_input_type::Match3DRunStartInput;
pub use match_3_d_run_stop_input_type::Match3DRunStopInput; pub use match_3_d_run_stop_input_type::Match3DRunStopInput;
pub use match_3_d_run_time_up_input_type::Match3DRunTimeUpInput; pub use match_3_d_run_time_up_input_type::Match3DRunTimeUpInput;
pub use match_3_d_runtime_run_row_type::Match3DRuntimeRunRow; pub use match_3_d_runtime_run_row_type::Match3DRuntimeRunRow;
pub use match_3_d_runtime_run_table::*; pub use match_3_d_runtime_run_table::*;
pub use match_3_d_tray_slot_snapshot_type::Match3DTraySlotSnapshot;
pub use match_3_d_work_delete_input_type::Match3DWorkDeleteInput; pub use match_3_d_work_delete_input_type::Match3DWorkDeleteInput;
pub use match_3_d_work_get_input_type::Match3DWorkGetInput; pub use match_3_d_work_get_input_type::Match3DWorkGetInput;
pub use match_3_d_work_procedure_result_type::Match3DWorkProcedureResult; pub use match_3_d_work_procedure_result_type::Match3DWorkProcedureResult;
pub use match_3_d_work_profile_row_type::Match3DWorkProfileRow; pub use match_3_d_work_profile_row_type::Match3DWorkProfileRow;
pub use match_3_d_work_profile_table::*; pub use match_3_d_work_profile_table::*;
pub use match_3_d_work_publish_input_type::Match3DWorkPublishInput; pub use match_3_d_work_publish_input_type::Match3DWorkPublishInput;
pub use match_3_d_work_snapshot_type::Match3DWorkSnapshot;
pub use match_3_d_work_update_input_type::Match3DWorkUpdateInput; pub use match_3_d_work_update_input_type::Match3DWorkUpdateInput;
pub use match_3_d_works_list_input_type::Match3DWorksListInput; pub use match_3_d_works_list_input_type::Match3DWorksListInput;
pub use match_3_d_works_procedure_result_type::Match3DWorksProcedureResult; pub use match_3_d_works_procedure_result_type::Match3DWorksProcedureResult;
@@ -1354,33 +1429,58 @@ pub use puzzle_agent_message_finalize_input_type::PuzzleAgentMessageFinalizeInpu
pub use puzzle_agent_message_kind_type::PuzzleAgentMessageKind; pub use puzzle_agent_message_kind_type::PuzzleAgentMessageKind;
pub use puzzle_agent_message_role_type::PuzzleAgentMessageRole; pub use puzzle_agent_message_role_type::PuzzleAgentMessageRole;
pub use puzzle_agent_message_row_type::PuzzleAgentMessageRow; pub use puzzle_agent_message_row_type::PuzzleAgentMessageRow;
pub use puzzle_agent_message_snapshot_type::PuzzleAgentMessageSnapshot;
pub use puzzle_agent_message_submit_input_type::PuzzleAgentMessageSubmitInput; pub use puzzle_agent_message_submit_input_type::PuzzleAgentMessageSubmitInput;
pub use puzzle_agent_message_table::*; pub use puzzle_agent_message_table::*;
pub use puzzle_agent_session_create_input_type::PuzzleAgentSessionCreateInput; pub use puzzle_agent_session_create_input_type::PuzzleAgentSessionCreateInput;
pub use puzzle_agent_session_get_input_type::PuzzleAgentSessionGetInput; pub use puzzle_agent_session_get_input_type::PuzzleAgentSessionGetInput;
pub use puzzle_agent_session_procedure_result_type::PuzzleAgentSessionProcedureResult; pub use puzzle_agent_session_procedure_result_type::PuzzleAgentSessionProcedureResult;
pub use puzzle_agent_session_row_type::PuzzleAgentSessionRow; pub use puzzle_agent_session_row_type::PuzzleAgentSessionRow;
pub use puzzle_agent_session_snapshot_type::PuzzleAgentSessionSnapshot;
pub use puzzle_agent_session_table::*; pub use puzzle_agent_session_table::*;
pub use puzzle_agent_stage_type::PuzzleAgentStage; pub use puzzle_agent_stage_type::PuzzleAgentStage;
pub use puzzle_agent_suggested_action_type::PuzzleAgentSuggestedAction;
pub use puzzle_anchor_item_type::PuzzleAnchorItem;
pub use puzzle_anchor_pack_type::PuzzleAnchorPack;
pub use puzzle_anchor_status_type::PuzzleAnchorStatus;
pub use puzzle_audio_asset_type::PuzzleAudioAsset;
pub use puzzle_board_snapshot_type::PuzzleBoardSnapshot;
pub use puzzle_cell_position_type::PuzzleCellPosition;
pub use puzzle_creator_intent_type::PuzzleCreatorIntent;
pub use puzzle_draft_compile_input_type::PuzzleDraftCompileInput; pub use puzzle_draft_compile_input_type::PuzzleDraftCompileInput;
pub use puzzle_draft_level_type::PuzzleDraftLevel;
pub use puzzle_event_kind_type::PuzzleEventKind; pub use puzzle_event_kind_type::PuzzleEventKind;
pub use puzzle_event_table::*; pub use puzzle_event_table::*;
pub use puzzle_event_type::PuzzleEvent; pub use puzzle_event_type::PuzzleEvent;
pub use puzzle_form_draft_save_input_type::PuzzleFormDraftSaveInput; pub use puzzle_form_draft_save_input_type::PuzzleFormDraftSaveInput;
pub use puzzle_form_draft_type::PuzzleFormDraft;
pub use puzzle_gallery_view_table::*;
pub use puzzle_generated_image_candidate_type::PuzzleGeneratedImageCandidate;
pub use puzzle_generated_images_save_input_type::PuzzleGeneratedImagesSaveInput; pub use puzzle_generated_images_save_input_type::PuzzleGeneratedImagesSaveInput;
pub use puzzle_leaderboard_entry_row_type::PuzzleLeaderboardEntryRow; pub use puzzle_leaderboard_entry_row_type::PuzzleLeaderboardEntryRow;
pub use puzzle_leaderboard_entry_table::*; pub use puzzle_leaderboard_entry_table::*;
pub use puzzle_leaderboard_entry_type::PuzzleLeaderboardEntry;
pub use puzzle_leaderboard_submit_input_type::PuzzleLeaderboardSubmitInput; pub use puzzle_leaderboard_submit_input_type::PuzzleLeaderboardSubmitInput;
pub use puzzle_merged_group_state_type::PuzzleMergedGroupState;
pub use puzzle_piece_state_type::PuzzlePieceState;
pub use puzzle_publication_status_type::PuzzlePublicationStatus; pub use puzzle_publication_status_type::PuzzlePublicationStatus;
pub use puzzle_publish_input_type::PuzzlePublishInput; pub use puzzle_publish_input_type::PuzzlePublishInput;
pub use puzzle_recommended_next_work_type::PuzzleRecommendedNextWork;
pub use puzzle_result_draft_type::PuzzleResultDraft;
pub use puzzle_result_preview_blocker_type::PuzzleResultPreviewBlocker;
pub use puzzle_result_preview_envelope_type::PuzzleResultPreviewEnvelope;
pub use puzzle_result_preview_finding_type::PuzzleResultPreviewFinding;
pub use puzzle_run_drag_input_type::PuzzleRunDragInput; pub use puzzle_run_drag_input_type::PuzzleRunDragInput;
pub use puzzle_run_get_input_type::PuzzleRunGetInput; pub use puzzle_run_get_input_type::PuzzleRunGetInput;
pub use puzzle_run_next_level_input_type::PuzzleRunNextLevelInput; pub use puzzle_run_next_level_input_type::PuzzleRunNextLevelInput;
pub use puzzle_run_pause_input_type::PuzzleRunPauseInput; pub use puzzle_run_pause_input_type::PuzzleRunPauseInput;
pub use puzzle_run_procedure_result_type::PuzzleRunProcedureResult; pub use puzzle_run_procedure_result_type::PuzzleRunProcedureResult;
pub use puzzle_run_prop_input_type::PuzzleRunPropInput; pub use puzzle_run_prop_input_type::PuzzleRunPropInput;
pub use puzzle_run_snapshot_type::PuzzleRunSnapshot;
pub use puzzle_run_start_input_type::PuzzleRunStartInput; pub use puzzle_run_start_input_type::PuzzleRunStartInput;
pub use puzzle_run_swap_input_type::PuzzleRunSwapInput; pub use puzzle_run_swap_input_type::PuzzleRunSwapInput;
pub use puzzle_runtime_level_snapshot_type::PuzzleRuntimeLevelSnapshot;
pub use puzzle_runtime_level_status_type::PuzzleRuntimeLevelStatus;
pub use puzzle_runtime_run_row_type::PuzzleRuntimeRunRow; pub use puzzle_runtime_run_row_type::PuzzleRuntimeRunRow;
pub use puzzle_runtime_run_table::*; pub use puzzle_runtime_run_table::*;
pub use puzzle_select_cover_image_input_type::PuzzleSelectCoverImageInput; pub use puzzle_select_cover_image_input_type::PuzzleSelectCoverImageInput;
@@ -1392,6 +1492,7 @@ pub use puzzle_work_point_incentive_claim_input_type::PuzzleWorkPointIncentiveCl
pub use puzzle_work_procedure_result_type::PuzzleWorkProcedureResult; pub use puzzle_work_procedure_result_type::PuzzleWorkProcedureResult;
pub use puzzle_work_profile_row_type::PuzzleWorkProfileRow; pub use puzzle_work_profile_row_type::PuzzleWorkProfileRow;
pub use puzzle_work_profile_table::*; pub use puzzle_work_profile_table::*;
pub use puzzle_work_profile_type::PuzzleWorkProfile;
pub use puzzle_work_remix_input_type::PuzzleWorkRemixInput; pub use puzzle_work_remix_input_type::PuzzleWorkRemixInput;
pub use puzzle_work_upsert_input_type::PuzzleWorkUpsertInput; pub use puzzle_work_upsert_input_type::PuzzleWorkUpsertInput;
pub use puzzle_works_list_input_type::PuzzleWorksListInput; pub use puzzle_works_list_input_type::PuzzleWorksListInput;
@@ -1583,30 +1684,41 @@ pub use seed_analytics_date_dimensions_reducer::seed_analytics_date_dimensions;
pub use select_puzzle_cover_image_procedure::select_puzzle_cover_image; pub use select_puzzle_cover_image_procedure::select_puzzle_cover_image;
pub use square_hole_agent_message_finalize_input_type::SquareHoleAgentMessageFinalizeInput; pub use square_hole_agent_message_finalize_input_type::SquareHoleAgentMessageFinalizeInput;
pub use square_hole_agent_message_row_type::SquareHoleAgentMessageRow; pub use square_hole_agent_message_row_type::SquareHoleAgentMessageRow;
pub use square_hole_agent_message_snapshot_type::SquareHoleAgentMessageSnapshot;
pub use square_hole_agent_message_submit_input_type::SquareHoleAgentMessageSubmitInput; pub use square_hole_agent_message_submit_input_type::SquareHoleAgentMessageSubmitInput;
pub use square_hole_agent_message_table::*; pub use square_hole_agent_message_table::*;
pub use square_hole_agent_session_create_input_type::SquareHoleAgentSessionCreateInput; pub use square_hole_agent_session_create_input_type::SquareHoleAgentSessionCreateInput;
pub use square_hole_agent_session_get_input_type::SquareHoleAgentSessionGetInput; pub use square_hole_agent_session_get_input_type::SquareHoleAgentSessionGetInput;
pub use square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; pub use square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult;
pub use square_hole_agent_session_row_type::SquareHoleAgentSessionRow; pub use square_hole_agent_session_row_type::SquareHoleAgentSessionRow;
pub use square_hole_agent_session_snapshot_type::SquareHoleAgentSessionSnapshot;
pub use square_hole_agent_session_table::*; pub use square_hole_agent_session_table::*;
pub use square_hole_creator_config_snapshot_type::SquareHoleCreatorConfigSnapshot;
pub use square_hole_draft_compile_input_type::SquareHoleDraftCompileInput; pub use square_hole_draft_compile_input_type::SquareHoleDraftCompileInput;
pub use square_hole_draft_snapshot_type::SquareHoleDraftSnapshot;
pub use square_hole_drop_feedback_snapshot_type::SquareHoleDropFeedbackSnapshot;
pub use square_hole_drop_shape_procedure_result_type::SquareHoleDropShapeProcedureResult; pub use square_hole_drop_shape_procedure_result_type::SquareHoleDropShapeProcedureResult;
pub use square_hole_hole_option_snapshot_type::SquareHoleHoleOptionSnapshot;
pub use square_hole_hole_snapshot_type::SquareHoleHoleSnapshot;
pub use square_hole_run_drop_input_type::SquareHoleRunDropInput; pub use square_hole_run_drop_input_type::SquareHoleRunDropInput;
pub use square_hole_run_get_input_type::SquareHoleRunGetInput; pub use square_hole_run_get_input_type::SquareHoleRunGetInput;
pub use square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; pub use square_hole_run_procedure_result_type::SquareHoleRunProcedureResult;
pub use square_hole_run_restart_input_type::SquareHoleRunRestartInput; pub use square_hole_run_restart_input_type::SquareHoleRunRestartInput;
pub use square_hole_run_snapshot_type::SquareHoleRunSnapshot;
pub use square_hole_run_start_input_type::SquareHoleRunStartInput; pub use square_hole_run_start_input_type::SquareHoleRunStartInput;
pub use square_hole_run_stop_input_type::SquareHoleRunStopInput; pub use square_hole_run_stop_input_type::SquareHoleRunStopInput;
pub use square_hole_run_time_up_input_type::SquareHoleRunTimeUpInput; pub use square_hole_run_time_up_input_type::SquareHoleRunTimeUpInput;
pub use square_hole_runtime_run_row_type::SquareHoleRuntimeRunRow; pub use square_hole_runtime_run_row_type::SquareHoleRuntimeRunRow;
pub use square_hole_runtime_run_table::*; pub use square_hole_runtime_run_table::*;
pub use square_hole_shape_option_snapshot_type::SquareHoleShapeOptionSnapshot;
pub use square_hole_shape_snapshot_type::SquareHoleShapeSnapshot;
pub use square_hole_work_delete_input_type::SquareHoleWorkDeleteInput; pub use square_hole_work_delete_input_type::SquareHoleWorkDeleteInput;
pub use square_hole_work_get_input_type::SquareHoleWorkGetInput; pub use square_hole_work_get_input_type::SquareHoleWorkGetInput;
pub use square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult; pub use square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult;
pub use square_hole_work_profile_row_type::SquareHoleWorkProfileRow; pub use square_hole_work_profile_row_type::SquareHoleWorkProfileRow;
pub use square_hole_work_profile_table::*; pub use square_hole_work_profile_table::*;
pub use square_hole_work_publish_input_type::SquareHoleWorkPublishInput; pub use square_hole_work_publish_input_type::SquareHoleWorkPublishInput;
pub use square_hole_work_snapshot_type::SquareHoleWorkSnapshot;
pub use square_hole_work_update_input_type::SquareHoleWorkUpdateInput; pub use square_hole_work_update_input_type::SquareHoleWorkUpdateInput;
pub use square_hole_works_list_input_type::SquareHoleWorksListInput; pub use square_hole_works_list_input_type::SquareHoleWorksListInput;
pub use square_hole_works_procedure_result_type::SquareHoleWorksProcedureResult; pub use square_hole_works_procedure_result_type::SquareHoleWorksProcedureResult;
@@ -1683,24 +1795,31 @@ pub use user_browse_history_table::*;
pub use user_browse_history_type::UserBrowseHistory; pub use user_browse_history_type::UserBrowseHistory;
pub use visual_novel_agent_message_finalize_input_type::VisualNovelAgentMessageFinalizeInput; pub use visual_novel_agent_message_finalize_input_type::VisualNovelAgentMessageFinalizeInput;
pub use visual_novel_agent_message_row_type::VisualNovelAgentMessageRow; pub use visual_novel_agent_message_row_type::VisualNovelAgentMessageRow;
pub use visual_novel_agent_message_snapshot_type::VisualNovelAgentMessageSnapshot;
pub use visual_novel_agent_message_submit_input_type::VisualNovelAgentMessageSubmitInput; pub use visual_novel_agent_message_submit_input_type::VisualNovelAgentMessageSubmitInput;
pub use visual_novel_agent_message_table::*; pub use visual_novel_agent_message_table::*;
pub use visual_novel_agent_session_create_input_type::VisualNovelAgentSessionCreateInput; pub use visual_novel_agent_session_create_input_type::VisualNovelAgentSessionCreateInput;
pub use visual_novel_agent_session_get_input_type::VisualNovelAgentSessionGetInput; pub use visual_novel_agent_session_get_input_type::VisualNovelAgentSessionGetInput;
pub use visual_novel_agent_session_procedure_result_type::VisualNovelAgentSessionProcedureResult; pub use visual_novel_agent_session_procedure_result_type::VisualNovelAgentSessionProcedureResult;
pub use visual_novel_agent_session_row_type::VisualNovelAgentSessionRow; pub use visual_novel_agent_session_row_type::VisualNovelAgentSessionRow;
pub use visual_novel_agent_session_snapshot_type::VisualNovelAgentSessionSnapshot;
pub use visual_novel_agent_session_table::*; pub use visual_novel_agent_session_table::*;
pub use visual_novel_history_procedure_result_type::VisualNovelHistoryProcedureResult; pub use visual_novel_history_procedure_result_type::VisualNovelHistoryProcedureResult;
pub use visual_novel_json_field_type::VisualNovelJsonField;
pub use visual_novel_json_value_type::VisualNovelJsonValue;
pub use visual_novel_run_get_input_type::VisualNovelRunGetInput; pub use visual_novel_run_get_input_type::VisualNovelRunGetInput;
pub use visual_novel_run_procedure_result_type::VisualNovelRunProcedureResult; pub use visual_novel_run_procedure_result_type::VisualNovelRunProcedureResult;
pub use visual_novel_run_snapshot_type::VisualNovelRunSnapshot;
pub use visual_novel_run_snapshot_upsert_input_type::VisualNovelRunSnapshotUpsertInput; pub use visual_novel_run_snapshot_upsert_input_type::VisualNovelRunSnapshotUpsertInput;
pub use visual_novel_run_start_input_type::VisualNovelRunStartInput; pub use visual_novel_run_start_input_type::VisualNovelRunStartInput;
pub use visual_novel_runtime_event_procedure_result_type::VisualNovelRuntimeEventProcedureResult; pub use visual_novel_runtime_event_procedure_result_type::VisualNovelRuntimeEventProcedureResult;
pub use visual_novel_runtime_event_record_input_type::VisualNovelRuntimeEventRecordInput; pub use visual_novel_runtime_event_record_input_type::VisualNovelRuntimeEventRecordInput;
pub use visual_novel_runtime_event_snapshot_type::VisualNovelRuntimeEventSnapshot;
pub use visual_novel_runtime_event_table::*; pub use visual_novel_runtime_event_table::*;
pub use visual_novel_runtime_event_type::VisualNovelRuntimeEvent; pub use visual_novel_runtime_event_type::VisualNovelRuntimeEvent;
pub use visual_novel_runtime_history_append_input_type::VisualNovelRuntimeHistoryAppendInput; pub use visual_novel_runtime_history_append_input_type::VisualNovelRuntimeHistoryAppendInput;
pub use visual_novel_runtime_history_entry_row_type::VisualNovelRuntimeHistoryEntryRow; pub use visual_novel_runtime_history_entry_row_type::VisualNovelRuntimeHistoryEntryRow;
pub use visual_novel_runtime_history_entry_snapshot_type::VisualNovelRuntimeHistoryEntrySnapshot;
pub use visual_novel_runtime_history_entry_table::*; pub use visual_novel_runtime_history_entry_table::*;
pub use visual_novel_runtime_history_list_input_type::VisualNovelRuntimeHistoryListInput; pub use visual_novel_runtime_history_list_input_type::VisualNovelRuntimeHistoryListInput;
pub use visual_novel_runtime_run_row_type::VisualNovelRuntimeRunRow; pub use visual_novel_runtime_run_row_type::VisualNovelRuntimeRunRow;
@@ -1712,6 +1831,7 @@ pub use visual_novel_work_procedure_result_type::VisualNovelWorkProcedureResult;
pub use visual_novel_work_profile_row_type::VisualNovelWorkProfileRow; pub use visual_novel_work_profile_row_type::VisualNovelWorkProfileRow;
pub use visual_novel_work_profile_table::*; pub use visual_novel_work_profile_table::*;
pub use visual_novel_work_publish_input_type::VisualNovelWorkPublishInput; pub use visual_novel_work_publish_input_type::VisualNovelWorkPublishInput;
pub use visual_novel_work_snapshot_type::VisualNovelWorkSnapshot;
pub use visual_novel_work_update_input_type::VisualNovelWorkUpdateInput; pub use visual_novel_work_update_input_type::VisualNovelWorkUpdateInput;
pub use visual_novel_works_list_input_type::VisualNovelWorksListInput; pub use visual_novel_works_list_input_type::VisualNovelWorksListInput;
pub use visual_novel_works_procedure_result_type::VisualNovelWorksProcedureResult; pub use visual_novel_works_procedure_result_type::VisualNovelWorksProcedureResult;
@@ -2052,6 +2172,7 @@ pub struct DbUpdate {
puzzle_agent_message: __sdk::TableUpdate<PuzzleAgentMessageRow>, puzzle_agent_message: __sdk::TableUpdate<PuzzleAgentMessageRow>,
puzzle_agent_session: __sdk::TableUpdate<PuzzleAgentSessionRow>, puzzle_agent_session: __sdk::TableUpdate<PuzzleAgentSessionRow>,
puzzle_event: __sdk::TableUpdate<PuzzleEvent>, puzzle_event: __sdk::TableUpdate<PuzzleEvent>,
puzzle_gallery_view: __sdk::TableUpdate<PuzzleWorkProfile>,
puzzle_leaderboard_entry: __sdk::TableUpdate<PuzzleLeaderboardEntryRow>, puzzle_leaderboard_entry: __sdk::TableUpdate<PuzzleLeaderboardEntryRow>,
puzzle_runtime_run: __sdk::TableUpdate<PuzzleRuntimeRunRow>, puzzle_runtime_run: __sdk::TableUpdate<PuzzleRuntimeRunRow>,
puzzle_work_profile: __sdk::TableUpdate<PuzzleWorkProfileRow>, puzzle_work_profile: __sdk::TableUpdate<PuzzleWorkProfileRow>,
@@ -2287,6 +2408,9 @@ impl TryFrom<__ws::v2::TransactionUpdate> for DbUpdate {
"puzzle_event" => db_update "puzzle_event" => db_update
.puzzle_event .puzzle_event
.append(puzzle_event_table::parse_table_update(table_update)?), .append(puzzle_event_table::parse_table_update(table_update)?),
"puzzle_gallery_view" => db_update
.puzzle_gallery_view
.append(puzzle_gallery_view_table::parse_table_update(table_update)?),
"puzzle_leaderboard_entry" => db_update.puzzle_leaderboard_entry.append( "puzzle_leaderboard_entry" => db_update.puzzle_leaderboard_entry.append(
puzzle_leaderboard_entry_table::parse_table_update(table_update)?, puzzle_leaderboard_entry_table::parse_table_update(table_update)?,
), ),
@@ -2842,6 +2966,10 @@ impl __sdk::DbUpdate for DbUpdate {
&self.visual_novel_work_profile, &self.visual_novel_work_profile,
) )
.with_updates_by_pk(|row| &row.profile_id); .with_updates_by_pk(|row| &row.profile_id);
diff.puzzle_gallery_view = cache.apply_diff_to_table::<PuzzleWorkProfile>(
"puzzle_gallery_view",
&self.puzzle_gallery_view,
);
diff diff
} }
@@ -3041,6 +3169,9 @@ impl __sdk::DbUpdate for DbUpdate {
"puzzle_event" => db_update "puzzle_event" => db_update
.puzzle_event .puzzle_event
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
"puzzle_gallery_view" => db_update
.puzzle_gallery_view
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
"puzzle_leaderboard_entry" => db_update "puzzle_leaderboard_entry" => db_update
.puzzle_leaderboard_entry .puzzle_leaderboard_entry
.append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?),
@@ -3321,6 +3452,9 @@ impl __sdk::DbUpdate for DbUpdate {
"puzzle_event" => db_update "puzzle_event" => db_update
.puzzle_event .puzzle_event
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
"puzzle_gallery_view" => db_update
.puzzle_gallery_view
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
"puzzle_leaderboard_entry" => db_update "puzzle_leaderboard_entry" => db_update
.puzzle_leaderboard_entry .puzzle_leaderboard_entry
.append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?),
@@ -3477,6 +3611,7 @@ pub struct AppliedDiff<'r> {
puzzle_agent_message: __sdk::TableAppliedDiff<'r, PuzzleAgentMessageRow>, puzzle_agent_message: __sdk::TableAppliedDiff<'r, PuzzleAgentMessageRow>,
puzzle_agent_session: __sdk::TableAppliedDiff<'r, PuzzleAgentSessionRow>, puzzle_agent_session: __sdk::TableAppliedDiff<'r, PuzzleAgentSessionRow>,
puzzle_event: __sdk::TableAppliedDiff<'r, PuzzleEvent>, puzzle_event: __sdk::TableAppliedDiff<'r, PuzzleEvent>,
puzzle_gallery_view: __sdk::TableAppliedDiff<'r, PuzzleWorkProfile>,
puzzle_leaderboard_entry: __sdk::TableAppliedDiff<'r, PuzzleLeaderboardEntryRow>, puzzle_leaderboard_entry: __sdk::TableAppliedDiff<'r, PuzzleLeaderboardEntryRow>,
puzzle_runtime_run: __sdk::TableAppliedDiff<'r, PuzzleRuntimeRunRow>, puzzle_runtime_run: __sdk::TableAppliedDiff<'r, PuzzleRuntimeRunRow>,
puzzle_work_profile: __sdk::TableAppliedDiff<'r, PuzzleWorkProfileRow>, puzzle_work_profile: __sdk::TableAppliedDiff<'r, PuzzleWorkProfileRow>,
@@ -3824,6 +3959,11 @@ impl<'r> __sdk::AppliedDiff<'r> for AppliedDiff<'r> {
&self.puzzle_event, &self.puzzle_event,
event, event,
); );
callbacks.invoke_table_row_callbacks::<PuzzleWorkProfile>(
"puzzle_gallery_view",
&self.puzzle_gallery_view,
event,
);
callbacks.invoke_table_row_callbacks::<PuzzleLeaderboardEntryRow>( callbacks.invoke_table_row_callbacks::<PuzzleLeaderboardEntryRow>(
"puzzle_leaderboard_entry", "puzzle_leaderboard_entry",
&self.puzzle_leaderboard_entry, &self.puzzle_leaderboard_entry,
@@ -4665,6 +4805,7 @@ impl __sdk::SpacetimeModule for RemoteModule {
puzzle_agent_message_table::register_table(client_cache); puzzle_agent_message_table::register_table(client_cache);
puzzle_agent_session_table::register_table(client_cache); puzzle_agent_session_table::register_table(client_cache);
puzzle_event_table::register_table(client_cache); puzzle_event_table::register_table(client_cache);
puzzle_gallery_view_table::register_table(client_cache);
puzzle_leaderboard_entry_table::register_table(client_cache); puzzle_leaderboard_entry_table::register_table(client_cache);
puzzle_runtime_run_table::register_table(client_cache); puzzle_runtime_run_table::register_table(client_cache);
puzzle_work_profile_table::register_table(client_cache); puzzle_work_profile_table::register_table(client_cache);
@@ -4756,6 +4897,7 @@ impl __sdk::SpacetimeModule for RemoteModule {
"puzzle_agent_message", "puzzle_agent_message",
"puzzle_agent_session", "puzzle_agent_session",
"puzzle_event", "puzzle_event",
"puzzle_gallery_view",
"puzzle_leaderboard_entry", "puzzle_leaderboard_entry",
"puzzle_runtime_run", "puzzle_runtime_run",
"puzzle_work_profile", "puzzle_work_profile",

View File

@@ -0,0 +1,116 @@
// 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::puzzle_anchor_pack_type::PuzzleAnchorPack;
use super::puzzle_draft_level_type::PuzzleDraftLevel;
use super::puzzle_publication_status_type::PuzzlePublicationStatus;
use super::puzzle_work_profile_type::PuzzleWorkProfile;
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
/// Table handle for the table `puzzle_gallery_view`.
///
/// Obtain a handle from the [`PuzzleGalleryViewTableAccess::puzzle_gallery_view`] method on [`super::RemoteTables`],
/// like `ctx.db.puzzle_gallery_view()`.
///
/// Users are encouraged not to explicitly reference this type,
/// but to directly chain method calls,
/// like `ctx.db.puzzle_gallery_view().on_insert(...)`.
pub struct PuzzleGalleryViewTableHandle<'ctx> {
imp: __sdk::TableHandle<PuzzleWorkProfile>,
ctx: std::marker::PhantomData<&'ctx super::RemoteTables>,
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the table `puzzle_gallery_view`.
///
/// Implemented for [`super::RemoteTables`].
pub trait PuzzleGalleryViewTableAccess {
#[allow(non_snake_case)]
/// Obtain a [`PuzzleGalleryViewTableHandle`], which mediates access to the table `puzzle_gallery_view`.
fn puzzle_gallery_view(&self) -> PuzzleGalleryViewTableHandle<'_>;
}
impl PuzzleGalleryViewTableAccess for super::RemoteTables {
fn puzzle_gallery_view(&self) -> PuzzleGalleryViewTableHandle<'_> {
PuzzleGalleryViewTableHandle {
imp: self
.imp
.get_table::<PuzzleWorkProfile>("puzzle_gallery_view"),
ctx: std::marker::PhantomData,
}
}
}
pub struct PuzzleGalleryViewInsertCallbackId(__sdk::CallbackId);
pub struct PuzzleGalleryViewDeleteCallbackId(__sdk::CallbackId);
impl<'ctx> __sdk::Table for PuzzleGalleryViewTableHandle<'ctx> {
type Row = PuzzleWorkProfile;
type EventContext = super::EventContext;
fn count(&self) -> u64 {
self.imp.count()
}
fn iter(&self) -> impl Iterator<Item = PuzzleWorkProfile> + '_ {
self.imp.iter()
}
type InsertCallbackId = PuzzleGalleryViewInsertCallbackId;
fn on_insert(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> PuzzleGalleryViewInsertCallbackId {
PuzzleGalleryViewInsertCallbackId(self.imp.on_insert(Box::new(callback)))
}
fn remove_on_insert(&self, callback: PuzzleGalleryViewInsertCallbackId) {
self.imp.remove_on_insert(callback.0)
}
type DeleteCallbackId = PuzzleGalleryViewDeleteCallbackId;
fn on_delete(
&self,
callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static,
) -> PuzzleGalleryViewDeleteCallbackId {
PuzzleGalleryViewDeleteCallbackId(self.imp.on_delete(Box::new(callback)))
}
fn remove_on_delete(&self, callback: PuzzleGalleryViewDeleteCallbackId) {
self.imp.remove_on_delete(callback.0)
}
}
#[doc(hidden)]
pub(super) fn register_table(client_cache: &mut __sdk::ClientCache<super::RemoteModule>) {
let _table = client_cache.get_or_make_table::<PuzzleWorkProfile>("puzzle_gallery_view");
}
#[doc(hidden)]
pub(super) fn parse_table_update(
raw_updates: __ws::v2::TableUpdate,
) -> __sdk::Result<__sdk::TableUpdate<PuzzleWorkProfile>> {
__sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| {
__sdk::InternalError::failed_parse("TableUpdate<PuzzleWorkProfile>", "TableUpdate")
.with_cause(e)
.into()
})
}
#[allow(non_camel_case_types)]
/// Extension trait for query builder access to the table `PuzzleWorkProfile`.
///
/// Implemented for [`__sdk::QueryTableAccessor`].
pub trait puzzle_gallery_viewQueryTableAccess {
#[allow(non_snake_case)]
/// Get a query builder for the table `PuzzleWorkProfile`.
fn puzzle_gallery_view(&self) -> __sdk::__query_builder::Table<PuzzleWorkProfile>;
}
impl puzzle_gallery_viewQueryTableAccess for __sdk::QueryTableAccessor {
fn puzzle_gallery_view(&self) -> __sdk::__query_builder::Table<PuzzleWorkProfile> {
__sdk::__query_builder::Table::new("puzzle_gallery_view")
}
}

View File

@@ -5,6 +5,45 @@ use crate::module_bindings::delete_puzzle_work_procedure::delete_puzzle_work;
use crate::module_bindings::record_puzzle_work_like_procedure::record_puzzle_work_like; use crate::module_bindings::record_puzzle_work_like_procedure::record_puzzle_work_like;
use crate::module_bindings::remix_puzzle_work_procedure::remix_puzzle_work; use crate::module_bindings::remix_puzzle_work_procedure::remix_puzzle_work;
use crate::module_bindings::save_puzzle_ui_background_procedure::save_puzzle_ui_background; use crate::module_bindings::save_puzzle_ui_background_procedure::save_puzzle_ui_background;
use std::collections::HashMap;
use std::time::{SystemTime, UNIX_EPOCH};
const PUBLIC_WORK_PLAY_DAY_MICROS: i64 = 86_400_000_000;
const PUBLIC_WORK_RECENT_PLAY_WINDOW_DAYS: i64 = 7;
fn current_unix_micros() -> i64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|duration| duration.as_micros() as i64)
.unwrap_or(0)
}
fn current_public_work_day() -> i64 {
current_unix_micros().div_euclid(PUBLIC_WORK_PLAY_DAY_MICROS)
}
fn puzzle_gallery_recent_play_counts(connection: &DbConnection) -> HashMap<String, u32> {
let current_day = current_public_work_day();
let first_day = current_day - (PUBLIC_WORK_RECENT_PLAY_WINDOW_DAYS - 1);
let mut counts = HashMap::new();
for row in connection
.db()
.public_work_play_daily_stat()
.iter()
{
if row.source_type != "puzzle"
|| row.played_day < first_day
|| row.played_day > current_day
{
continue;
}
let entry: &mut u32 = counts.entry(row.profile_id).or_insert(0);
*entry = (*entry).saturating_add(row.play_count);
}
counts
}
impl SpacetimeClient { impl SpacetimeClient {
pub async fn create_puzzle_agent_session( pub async fn create_puzzle_agent_session(
@@ -397,15 +436,21 @@ impl SpacetimeClient {
pub async fn list_puzzle_gallery( pub async fn list_puzzle_gallery(
&self, &self,
) -> Result<Vec<PuzzleWorkProfileRecord>, SpacetimeClientError> { ) -> Result<Vec<PuzzleWorkProfileRecord>, SpacetimeClientError> {
self.call_after_connect(move |connection, sender| { self.read_after_connect(move |connection| {
connection let mut items = connection.db().puzzle_gallery_view().iter().collect::<Vec<_>>();
.procedures() items.sort_by(|left, right| right.updated_at_micros.cmp(&left.updated_at_micros));
.list_puzzle_gallery_then(move |_, result| { let recent_play_counts = puzzle_gallery_recent_play_counts(connection);
let mapped = result Ok(items
.map_err(SpacetimeClientError::from_sdk_error) .into_iter()
.and_then(map_puzzle_works_procedure_result); .map(|item| {
send_once(&sender, mapped); let mut record = map_puzzle_work_profile(item);
}); record.recent_play_count_7d = recent_play_counts
.get(&record.profile_id)
.copied()
.unwrap_or(0);
record
})
.collect())
}) })
.await .await
} }

View File

@@ -31,7 +31,9 @@ use module_runtime::visible_runtime_profile_user_tags;
use serde_json::from_str as json_from_str; use serde_json::from_str as json_from_str;
use serde_json::json; use serde_json::json;
use serde_json::to_string as json_to_string; use serde_json::to_string as json_to_string;
use spacetimedb::{ProcedureContext, SpacetimeType, Table, Timestamp, TxContext}; use spacetimedb::{
AnonymousViewContext, ProcedureContext, SpacetimeType, Table, Timestamp, TxContext,
};
use crate::auth::user_account; use crate::auth::user_account;
@@ -112,6 +114,33 @@ pub struct PuzzleWorkProfileRow {
point_incentive_claimed_points: u64, point_incentive_claimed_points: u64,
} }
/// 拼图广场公开列表投影。
///
/// `puzzle_work_profile` 是私有真相表HTTP gallery 只订阅这个 view
/// 避免每次请求回到 procedure 重新扫表、组装列表和跨层 JSON 往返。
#[spacetimedb::view(accessor = puzzle_gallery_view, public)]
pub fn puzzle_gallery_view(ctx: &AnonymousViewContext) -> Vec<PuzzleWorkProfile> {
let mut items = ctx
.db
.puzzle_work_profile()
.by_puzzle_work_publication_status()
.filter(PuzzlePublicationStatus::Published)
.filter_map(|row| match build_puzzle_work_profile_from_row_without_recent_count(&row) {
Ok(profile) => Some(profile),
Err(error) => {
log::warn!(
"拼图广场 view 跳过损坏的作品投影 profile_id={}: {}",
row.profile_id,
error
);
None
}
})
.collect::<Vec<_>>();
items.sort_by(|left, right| right.updated_at_micros.cmp(&left.updated_at_micros));
items
}
/// 拼图创作事件类型。 /// 拼图创作事件类型。
/// ///
/// 事件表只广播跨层订阅需要的轻量事实,作品真相仍以 /// 事件表只广播跨层订阅需要的轻量事实,作品真相仍以
@@ -187,12 +216,12 @@ pub fn create_puzzle_agent_session(
match ctx.try_with_tx(|tx| create_puzzle_agent_session_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| create_puzzle_agent_session_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -206,12 +235,12 @@ pub fn get_puzzle_agent_session(
match ctx.try_with_tx(|tx| get_puzzle_agent_session_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| get_puzzle_agent_session_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -225,12 +254,12 @@ pub fn submit_puzzle_agent_message(
match ctx.try_with_tx(|tx| submit_puzzle_agent_message_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| submit_puzzle_agent_message_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -244,12 +273,12 @@ pub fn finalize_puzzle_agent_message_turn(
match ctx.try_with_tx(|tx| finalize_puzzle_agent_message_turn_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| finalize_puzzle_agent_message_turn_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -263,12 +292,12 @@ pub fn compile_puzzle_agent_draft(
match ctx.try_with_tx(|tx| compile_puzzle_agent_draft_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| compile_puzzle_agent_draft_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -284,12 +313,12 @@ pub fn save_puzzle_form_draft(
match ctx.try_with_tx(|tx| save_puzzle_form_draft_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| save_puzzle_form_draft_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -303,12 +332,12 @@ pub fn save_puzzle_generated_images(
match ctx.try_with_tx(|tx| save_puzzle_generated_images_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| save_puzzle_generated_images_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -322,12 +351,12 @@ pub fn save_puzzle_ui_background(
match ctx.try_with_tx(|tx| save_puzzle_ui_background_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| save_puzzle_ui_background_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -341,12 +370,12 @@ pub fn select_puzzle_cover_image(
match ctx.try_with_tx(|tx| select_puzzle_cover_image_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| select_puzzle_cover_image_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -360,12 +389,12 @@ pub fn publish_puzzle_work(
match ctx.try_with_tx(|tx| publish_puzzle_work_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| publish_puzzle_work_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -379,12 +408,12 @@ pub fn list_puzzle_works(
match ctx.try_with_tx(|tx| list_puzzle_works_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| list_puzzle_works_tx(tx, input.clone())) {
Ok(items) => PuzzleWorksProcedureResult { Ok(items) => PuzzleWorksProcedureResult {
ok: true, ok: true,
items_json: Some(serialize_json(&items)), items,
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorksProcedureResult { Err(message) => PuzzleWorksProcedureResult {
ok: false, ok: false,
items_json: None, items: Vec::new(),
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -398,12 +427,12 @@ pub fn get_puzzle_work_detail(
match ctx.try_with_tx(|tx| get_puzzle_work_detail_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| get_puzzle_work_detail_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -417,12 +446,12 @@ pub fn update_puzzle_work(
match ctx.try_with_tx(|tx| update_puzzle_work_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| update_puzzle_work_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -436,12 +465,12 @@ pub fn delete_puzzle_work(
match ctx.try_with_tx(|tx| delete_puzzle_work_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| delete_puzzle_work_tx(tx, input.clone())) {
Ok(items) => PuzzleWorksProcedureResult { Ok(items) => PuzzleWorksProcedureResult {
ok: true, ok: true,
items_json: Some(serialize_json(&items)), items,
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorksProcedureResult { Err(message) => PuzzleWorksProcedureResult {
ok: false, ok: false,
items_json: None, items: Vec::new(),
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -452,12 +481,12 @@ pub fn list_puzzle_gallery(ctx: &mut ProcedureContext) -> PuzzleWorksProcedureRe
match ctx.try_with_tx(|tx| list_puzzle_gallery_tx(tx)) { match ctx.try_with_tx(|tx| list_puzzle_gallery_tx(tx)) {
Ok(items) => PuzzleWorksProcedureResult { Ok(items) => PuzzleWorksProcedureResult {
ok: true, ok: true,
items_json: Some(serialize_json(&items)), items,
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorksProcedureResult { Err(message) => PuzzleWorksProcedureResult {
ok: false, ok: false,
items_json: None, items: Vec::new(),
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -471,12 +500,12 @@ pub fn get_puzzle_gallery_detail(
match ctx.try_with_tx(|tx| get_puzzle_gallery_detail_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| get_puzzle_gallery_detail_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -490,12 +519,12 @@ pub fn record_puzzle_work_like(
match ctx.try_with_tx(|tx| record_puzzle_work_like_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| record_puzzle_work_like_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -509,12 +538,12 @@ pub fn remix_puzzle_work(
match ctx.try_with_tx(|tx| remix_puzzle_work_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| remix_puzzle_work_tx(tx, input.clone())) {
Ok(session) => PuzzleAgentSessionProcedureResult { Ok(session) => PuzzleAgentSessionProcedureResult {
ok: true, ok: true,
session_json: Some(serialize_json(&session)), session: Some(session),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleAgentSessionProcedureResult { Err(message) => PuzzleAgentSessionProcedureResult {
ok: false, ok: false,
session_json: None, session: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -528,12 +557,12 @@ pub fn start_puzzle_run(
match ctx.try_with_tx(|tx| start_puzzle_run_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| start_puzzle_run_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -547,12 +576,12 @@ pub fn get_puzzle_run(
match ctx.try_with_tx(|tx| get_puzzle_run_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| get_puzzle_run_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -566,12 +595,12 @@ pub fn swap_puzzle_pieces(
match ctx.try_with_tx(|tx| swap_puzzle_pieces_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| swap_puzzle_pieces_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -585,12 +614,12 @@ pub fn drag_puzzle_piece_or_group(
match ctx.try_with_tx(|tx| drag_puzzle_piece_or_group_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| drag_puzzle_piece_or_group_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -604,12 +633,12 @@ pub fn advance_puzzle_next_level(
match ctx.try_with_tx(|tx| advance_puzzle_next_level_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| advance_puzzle_next_level_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -623,12 +652,12 @@ pub fn update_puzzle_run_pause(
match ctx.try_with_tx(|tx| update_puzzle_run_pause_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| update_puzzle_run_pause_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -642,12 +671,12 @@ pub fn use_puzzle_runtime_prop(
match ctx.try_with_tx(|tx| use_puzzle_runtime_prop_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| use_puzzle_runtime_prop_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -661,12 +690,12 @@ pub fn claim_puzzle_work_point_incentive(
match ctx.try_with_tx(|tx| claim_puzzle_work_point_incentive_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| claim_puzzle_work_point_incentive_tx(tx, input.clone())) {
Ok(item) => PuzzleWorkProcedureResult { Ok(item) => PuzzleWorkProcedureResult {
ok: true, ok: true,
item_json: Some(serialize_json(&item)), item: Some(item),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleWorkProcedureResult { Err(message) => PuzzleWorkProcedureResult {
ok: false, ok: false,
item_json: None, item: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -680,12 +709,12 @@ pub fn submit_puzzle_leaderboard_entry(
match ctx.try_with_tx(|tx| submit_puzzle_leaderboard_entry_tx(tx, input.clone())) { match ctx.try_with_tx(|tx| submit_puzzle_leaderboard_entry_tx(tx, input.clone())) {
Ok(run) => PuzzleRunProcedureResult { Ok(run) => PuzzleRunProcedureResult {
ok: true, ok: true,
run_json: Some(serialize_json(&run)), run: Some(run),
error_message: None, error_message: None,
}, },
Err(message) => PuzzleRunProcedureResult { Err(message) => PuzzleRunProcedureResult {
ok: false, ok: false,
run_json: None, run: None,
error_message: Some(message), error_message: Some(message),
}, },
} }
@@ -1264,8 +1293,8 @@ fn list_puzzle_works_tx(
let mut items = ctx let mut items = ctx
.db .db
.puzzle_work_profile() .puzzle_work_profile()
.iter() .by_puzzle_work_owner_user_id()
.filter(|row| row.owner_user_id == input.owner_user_id) .filter(&input.owner_user_id)
.map(|row| build_puzzle_work_profile_from_row(&row)) .map(|row| build_puzzle_work_profile_from_row(&row))
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
items.sort_by(|left, right| right.updated_at_micros.cmp(&left.updated_at_micros)); items.sort_by(|left, right| right.updated_at_micros.cmp(&left.updated_at_micros));
@@ -1446,8 +1475,8 @@ fn delete_puzzle_work_tx(
for message in ctx for message in ctx
.db .db
.puzzle_agent_message() .puzzle_agent_message()
.iter() .by_puzzle_agent_message_session_id()
.filter(|message| message.session_id == *session_id) .filter(session_id)
.collect::<Vec<_>>() .collect::<Vec<_>>()
{ {
ctx.db ctx.db
@@ -1459,10 +1488,9 @@ fn delete_puzzle_work_tx(
for run in ctx for run in ctx
.db .db
.puzzle_runtime_run() .puzzle_runtime_run()
.iter() .by_puzzle_runtime_run_owner_user_id()
.filter(|run| { .filter(&input.owner_user_id)
run.owner_user_id == input.owner_user_id && run.entry_profile_id == input.profile_id .filter(|run| run.entry_profile_id == input.profile_id)
})
.collect::<Vec<_>>() .collect::<Vec<_>>()
{ {
ctx.db.puzzle_runtime_run().run_id().delete(&run.run_id); ctx.db.puzzle_runtime_run().run_id().delete(&run.run_id);
@@ -1481,8 +1509,8 @@ fn list_puzzle_gallery_tx(ctx: &TxContext) -> Result<Vec<PuzzleWorkProfile>, Str
let rows = ctx let rows = ctx
.db .db
.puzzle_work_profile() .puzzle_work_profile()
.iter() .by_puzzle_work_publication_status()
.filter(|row| row.publication_status == PuzzlePublicationStatus::Published) .filter(PuzzlePublicationStatus::Published)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let profile_ids = rows let profile_ids = rows
.iter() .iter()
@@ -2542,8 +2570,8 @@ fn list_session_messages(ctx: &TxContext, session_id: &str) -> Vec<PuzzleAgentMe
let mut items = ctx let mut items = ctx
.db .db
.puzzle_agent_message() .puzzle_agent_message()
.iter() .by_puzzle_agent_message_session_id()
.filter(|message| message.session_id == session_id) .filter(&session_id.to_string())
.map(|message| PuzzleAgentMessageSnapshot { .map(|message| PuzzleAgentMessageSnapshot {
message_id: message.message_id.clone(), message_id: message.message_id.clone(),
session_id: message.session_id.clone(), session_id: message.session_id.clone(),
@@ -3152,8 +3180,8 @@ fn replace_generated_candidate(
fn list_published_puzzle_profiles(ctx: &TxContext) -> Result<Vec<PuzzleWorkProfile>, String> { fn list_published_puzzle_profiles(ctx: &TxContext) -> Result<Vec<PuzzleWorkProfile>, String> {
ctx.db ctx.db
.puzzle_work_profile() .puzzle_work_profile()
.iter() .by_puzzle_work_publication_status()
.filter(|row| row.publication_status == PuzzlePublicationStatus::Published) .filter(PuzzlePublicationStatus::Published)
.map(|row| build_puzzle_work_profile_from_row(&row)) .map(|row| build_puzzle_work_profile_from_row(&row))
.collect() .collect()
} }
@@ -3319,8 +3347,8 @@ fn list_puzzle_leaderboard_entries(
let mut rows = ctx let mut rows = ctx
.db .db
.puzzle_leaderboard_entry() .puzzle_leaderboard_entry()
.iter() .by_puzzle_leaderboard_profile_grid()
.filter(|row| row.profile_id == profile_id && row.grid_size == grid_size) .filter((profile_id, grid_size))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
rows.sort_by(|left, right| { rows.sort_by(|left, right| {
left.best_elapsed_ms left.best_elapsed_ms