fix: restore match3d indexed visibility reads

This commit is contained in:
kdletters
2026-05-28 04:27:51 +08:00
parent a0134ce966
commit 82f24ded1b
5 changed files with 32 additions and 31 deletions

View File

@@ -472,10 +472,12 @@ npm run check:server-rs-ddd
- Rust 结构体:`Match3DRuntimeRunRow`
- 源码:`server-rs/crates/spacetime-module/src/match3d/tables.rs`
### `match3d_work_profile`
### `match_3_d_work_profile`
- Rust 结构体:`Match3DWorkProfileRow`
- Rust accessor`match_3_d_work_profile`
- 源码:`server-rs/crates/spacetime-module/src/match3d/tables.rs`
- 兼容说明dev 现有 SpacetimeDB 元数据中的真实表名 / 索引名为 `match_3_d_work_profile``match_3_d_work_profile_*_idx_btree`。module 内部 accessor 必须与该 canonical name 对齐,避免 Rust SDK 在 `index_id_from_name` 初始化二级索引时查找 `match3d_work_profile_*` 并触发 `No such index` panic。`migration.rs` 仍兼容旧迁移包中的 `match3d_work_profile` 表名补默认字段。
### SpacetimeDB view`match_3_d_gallery_view`

View File

@@ -23,13 +23,13 @@ use spacetimedb::AnonymousViewContext;
/// 抓大鹅公开广场列表投影。
///
/// `match3d_work_profile` 是玩法源表HTTP gallery 只订阅这个轻量 view
/// `match_3_d_work_profile` 是玩法源表HTTP gallery 只订阅这个轻量 view
/// 避免每个公开列表请求重新调用 procedure 扫描和组装全量列表。
#[spacetimedb::view(accessor = match3d_gallery_view, public)]
pub fn match3d_gallery_view(ctx: &AnonymousViewContext) -> Vec<Match3DGalleryViewRow> {
let mut items = ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.by_match3d_work_publication_status()
.filter(MATCH3D_PUBLICATION_PUBLISHED)
.filter(|row| row.visible)
@@ -501,7 +501,7 @@ fn compile_match3d_draft_tx(
validate_config(&config)?;
let existing_work = ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&input.profile_id)
.filter(|row| row.owner_user_id == input.owner_user_id);
@@ -695,15 +695,14 @@ fn list_match3d_works_tx(
) -> Result<Vec<Match3DWorkSnapshot>, String> {
let rows = if input.published_only {
ctx.db
.match3d_work_profile()
.iter()
// 中文注释:列表页优先稳定性,避免二级索引 filter 初始化异常直接打爆模块实例。
.filter(|row| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED)
.match_3_d_work_profile()
.by_match3d_work_publication_status()
.filter(MATCH3D_PUBLICATION_PUBLISHED)
.collect::<Vec<_>>()
} else {
require_non_empty(&input.owner_user_id, "match3d owner_user_id")?;
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.iter()
.filter(|row| row.owner_user_id == input.owner_user_id)
.collect::<Vec<_>>()
@@ -727,14 +726,14 @@ fn get_match3d_work_detail_tx(
) -> Result<Match3DWorkSnapshot, String> {
let row = ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&input.profile_id)
.filter(|row| {
row.owner_user_id == input.owner_user_id
|| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED
})
.ok_or_else(|| "match3d_work_profile 不存在".to_string())?;
.ok_or_else(|| "match_3_d_work_profile 不存在".to_string())?;
build_work_snapshot(&row)
}
@@ -744,7 +743,7 @@ fn delete_match3d_work_tx(
) -> Result<Vec<Match3DWorkSnapshot>, String> {
let work = find_owned_work(ctx, &input.profile_id, &input.owner_user_id)?;
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.delete(&work.profile_id);
for run in ctx
@@ -782,14 +781,14 @@ fn start_match3d_run_tx(
}
let work = ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&input.profile_id)
.filter(|row| {
row.owner_user_id == input.owner_user_id
|| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED
})
.ok_or_else(|| "match3d_work_profile 不存在".to_string())?;
.ok_or_else(|| "match_3_d_work_profile 不存在".to_string())?;
let started_at_ms = if input.started_at_ms > 0 {
input.started_at_ms
} else {
@@ -966,11 +965,11 @@ fn find_owned_work(
require_non_empty(profile_id, "match3d profile_id")?;
require_non_empty(owner_user_id, "match3d owner_user_id")?;
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&profile_id.to_string())
.filter(|row| row.owner_user_id == owner_user_id)
.ok_or_else(|| "match3d_work_profile 不存在".to_string())
.ok_or_else(|| "match_3_d_work_profile 不存在".to_string())
}
fn find_owned_run(
@@ -1260,17 +1259,17 @@ fn click_result(
fn upsert_work(ctx: &ReducerContext, work: Match3DWorkProfileRow) {
if ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&work.profile_id)
.is_some()
{
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.delete(&work.profile_id);
}
ctx.db.match3d_work_profile().insert(work);
ctx.db.match_3_d_work_profile().insert(work);
}
fn replace_session(
@@ -1291,10 +1290,10 @@ fn replace_work(
next: Match3DWorkProfileRow,
) {
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.delete(&current.profile_id);
ctx.db.match3d_work_profile().insert(next);
ctx.db.match_3_d_work_profile().insert(next);
}
fn clone_session(row: &Match3DAgentSessionRow) -> Match3DAgentSessionRow {

View File

@@ -37,7 +37,7 @@ pub struct Match3DAgentMessageRow {
}
#[spacetimedb::table(
accessor = match3d_work_profile,
accessor = match_3_d_work_profile,
index(accessor = by_match3d_work_owner_user_id, btree(columns = [owner_user_id])),
index(accessor = by_match3d_work_publication_status, btree(columns = [publication_status]))
)]

View File

@@ -16,7 +16,7 @@ use crate::jump_hop::tables::{
jump_hop_agent_session, jump_hop_event, jump_hop_runtime_run, jump_hop_work_profile,
};
use crate::match3d::tables::{
match3d_agent_message, match3d_agent_session, match3d_runtime_run, match3d_work_profile,
match3d_agent_message, match3d_agent_session, match3d_runtime_run, match_3_d_work_profile,
};
use crate::puzzle::{
puzzle_agent_message, puzzle_agent_session, puzzle_event, puzzle_leaderboard_entry,
@@ -238,7 +238,7 @@ macro_rules! migration_tables {
bark_battle_personal_best_projection,
match3d_agent_session,
match3d_agent_message,
match3d_work_profile,
match_3_d_work_profile,
match3d_runtime_run,
jump_hop_agent_session,
jump_hop_work_profile,
@@ -1324,7 +1324,7 @@ fn normalize_migration_row(table_name: &str, value: &serde_json::Value) -> serde
.or_insert_with(|| serde_json::Value::Bool(true));
}
}
if table_name == "match3d_work_profile" {
if table_name == "match_3_d_work_profile" || table_name == "match3d_work_profile" {
if let Some(object) = next_value.as_object_mut() {
// 中文注释:作品可见性字段晚于首版作品表加入,旧迁移包按默认显示兼容。
object

View File

@@ -349,9 +349,9 @@ fn wooden_fish_work_visibility_snapshot(
fn list_match3d_work_visibility(ctx: &ReducerContext) -> Vec<AdminWorkVisibilitySnapshot> {
ctx.db
.match3d_work_profile()
.iter()
.filter(|row| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED)
.match_3_d_work_profile()
.by_match3d_work_publication_status()
.filter(MATCH3D_PUBLICATION_PUBLISHED)
.map(|row| match3d_work_visibility_snapshot(&row))
.collect()
}
@@ -363,7 +363,7 @@ fn update_match3d_work_visibility(
) -> Result<AdminWorkVisibilitySnapshot, String> {
let row = ctx
.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.find(&profile_id.to_string())
.ok_or_else(|| "抓大鹅作品不存在".to_string())?;
@@ -374,10 +374,10 @@ fn update_match3d_work_visibility(
let snapshot = match3d_work_visibility_snapshot(&next);
let profile_id = next.profile_id.clone();
ctx.db
.match3d_work_profile()
.match_3_d_work_profile()
.profile_id()
.delete(&profile_id);
ctx.db.match3d_work_profile().insert(next);
ctx.db.match_3_d_work_profile().insert(next);
Ok(snapshot)
}