operation_kind 白名单改为两 crate 共用的共享常量
- 白名单常量迁到 shared-contracts 并从 crate 根导出 - spacetime-module 的原子落库事务改为引用该常量,删除本地重复定义 - api-server 的登记测试不再解析对方源码文本,改为直接断言常量内容 - 后端架构文档补上白名单常量的位置与共用口径
This commit is contained in:
@@ -514,7 +514,7 @@ Responses 的终态载荷既是工具调用的恢复源,也是正文的恢复
|
||||
- `assetKind` 是数据库、Rust DTO 和对外 JSON 的可选语义类别真相;普通静态图片必须为空。不要新增或返回并列的 `mediaType`;前端 renderer 可以保留内部派生媒体类型,但不得回写后端。
|
||||
- 每次新增 `assetKind` 都必须分别完成“用户标签覆盖”和“快速编辑”两项资格评估;两者互不推导。可被用户选择不等于可快速编辑,属于图片媒体族也不等于自动进入快速编辑正向白名单。
|
||||
- `assetKind` 只描述素材类别,不代表生成配方可执行或允许“改造”;新增类别必须单独完成上表的 capability 决策和验收。
|
||||
- 编辑器前端暂无入口的后端生成类别同样适用本清单:四项资格评估、原子落库 `operation_kind` 白名单和画布回填口径都必须在对应技术方案里显式登记,未登记即视为未接入,不能靠“前端还没入口”跳过。生成类结果落库前 `EDITOR_GENERATION_OPERATION_KINDS` 必须已包含该 job kind,否则整笔事务被拒;画布回填只允许走 placement-only 口径(`build_editor_canvas_resource_placement_item`)。`EDITOR_CANVAS_ASSET_KINDS` 必须与前端 `CANVAS_ASSET_KIND_TAG_OPTIONS` 同步:前端已有标签入口而白名单缺项、或白名单多出前端不认的类别,都算接入未完成。Tripo 3D 的 `model3d` 已按该口径进入两端(见 `docs/technical/【技术方案】Tripo 3D生成API集成-2026-09-21.md`),其素材库行与后台 renderer 仍未进入。
|
||||
- 编辑器前端暂无入口的后端生成类别同样适用本清单:四项资格评估、原子落库 `operation_kind` 白名单和画布回填口径都必须在对应技术方案里显式登记,未登记即视为未接入,不能靠“前端还没入口”跳过。生成类结果落库前 `EDITOR_GENERATION_OPERATION_KINDS` 必须已包含该 job kind,否则整笔事务被拒;该白名单常量位于 `shared-contracts`(`shared_contracts::EDITOR_GENERATION_OPERATION_KINDS`),入队方与 SpacetimeDB 原子落库事务共用同一份清单,新增生成类型只改这一处;画布回填只允许走 placement-only 口径(`build_editor_canvas_resource_placement_item`)。`EDITOR_CANVAS_ASSET_KINDS` 必须与前端 `CANVAS_ASSET_KIND_TAG_OPTIONS` 同步:前端已有标签入口而白名单缺项、或白名单多出前端不认的类别,都算接入未完成。Tripo 3D 的 `model3d` 已按该口径进入两端(见 `docs/technical/【技术方案】Tripo 3D生成API集成-2026-09-21.md`),其素材库行与后台 renderer 仍未进入。
|
||||
- 只是新增分类或 renderer 且现有媒体字段足够时,不改 schema。只有必须跨刷新、复用、审核或公开保留的数据才新增类别专属字段。
|
||||
- legacy 数据必须先通过有界、可审计、带 dry-run/hash/apply 门禁的数据库迁移收口;迁移后的 api-server、mapper、主站、后台和画布只读取正式字段,不保留运行时 fallback。
|
||||
|
||||
|
||||
@@ -190,19 +190,12 @@ mod tests {
|
||||
}
|
||||
|
||||
/// 原子落库在 SpacetimeDB 侧按 operation_kind 白名单拒绝未知生成结果;
|
||||
/// 白名单是另一个 crate 里的字符串字面量,所以在这里按源码钉住,避免只在运行期才炸。
|
||||
/// 白名单与落库事务共用 shared-contracts 的常量,这里直接断言两个 job kind 都已登记。
|
||||
#[test]
|
||||
fn model3d_job_kinds_are_registered_in_editor_generation_whitelist() {
|
||||
let whitelist = include_str!("../../../spacetime-module/src/editor_project_storage.rs");
|
||||
let declared = whitelist
|
||||
.split_once("const EDITOR_GENERATION_OPERATION_KINDS")
|
||||
.and_then(|(_, rest)| rest.split_once("];"))
|
||||
.map(|(list, _)| list)
|
||||
.expect("应能在 SpacetimeDB storage 源码里定位 operation_kind 白名单");
|
||||
|
||||
for kind in Model3dJobKind::ALL {
|
||||
assert!(
|
||||
declared.contains(&format!("\"{}\"", kind.as_str())),
|
||||
shared_contracts::EDITOR_GENERATION_OPERATION_KINDS.contains(&kind.as_str()),
|
||||
"{} 必须在编辑器生成 operation_kind 白名单内",
|
||||
kind.as_str()
|
||||
);
|
||||
|
||||
@@ -5,6 +5,27 @@ pub const EDITOR_GENERATION_ASSET_ID_PREFIX: &str = "editor-asset-";
|
||||
pub const EDITOR_GENERATION_ASSET_OBJECT_ID_PREFIX: &str = "assetobj_";
|
||||
pub const EDITOR_GENERATION_ASSET_BINDING_ID_PREFIX: &str = "assetbind_";
|
||||
|
||||
/// 编辑器生成结果原子落库认可的 operation_kind 白名单。
|
||||
///
|
||||
/// 入队方(api-server)与原子落库事务(spacetime-module)共用这一份清单:事务会拒绝
|
||||
/// 清单外的 operation_kind,所以新增生成类型必须在这里登记;两侧测试都直接引用常量,
|
||||
/// 不再解析对方的源码文本。
|
||||
pub const EDITOR_GENERATION_OPERATION_KINDS: [&str; 12] = [
|
||||
"editor_image_generation",
|
||||
"editor_icon_spec_generation",
|
||||
"editor_image_edit",
|
||||
"editor_background_removal",
|
||||
"editor_icon_spritesheet_generation",
|
||||
"editor_ui_design_asset_extraction",
|
||||
"editor_character_animation_generation",
|
||||
"editor_video_generation",
|
||||
"editor_sound_effect_generation",
|
||||
"editor_background_music_generation",
|
||||
// Tripo 3D 的产物没有图片画布入口,但共用同一原子落库事务;不在这里登记就会被整笔拒绝。
|
||||
"model3d_text_to_model",
|
||||
"model3d_image_to_model",
|
||||
];
|
||||
|
||||
pub fn editor_generation_request_fingerprint(
|
||||
operation_kind: &str,
|
||||
request_payload_json: &str,
|
||||
|
||||
@@ -25,10 +25,10 @@ pub mod editor_generation;
|
||||
pub mod error_reports;
|
||||
pub use editor_generation::{
|
||||
EDITOR_GENERATION_ASSET_BINDING_ID_PREFIX, EDITOR_GENERATION_ASSET_ID_PREFIX,
|
||||
EDITOR_GENERATION_ASSET_OBJECT_ID_PREFIX, EDITOR_GENERATION_RESOURCE_ID_PREFIX,
|
||||
editor_generation_request_fingerprint, editor_generation_stable_asset_binding_id,
|
||||
editor_generation_stable_asset_id, editor_generation_stable_asset_object_id,
|
||||
editor_generation_stable_resource_id,
|
||||
EDITOR_GENERATION_ASSET_OBJECT_ID_PREFIX, EDITOR_GENERATION_OPERATION_KINDS,
|
||||
EDITOR_GENERATION_RESOURCE_ID_PREFIX, editor_generation_request_fingerprint,
|
||||
editor_generation_stable_asset_binding_id, editor_generation_stable_asset_id,
|
||||
editor_generation_stable_asset_object_id, editor_generation_stable_resource_id,
|
||||
};
|
||||
pub mod external_generation;
|
||||
pub mod game_creation_app;
|
||||
|
||||
@@ -26,21 +26,8 @@ const EDITOR_IMAGE_ASSET_KIND_CLEANUP_CANVAS_MAX_BATCH_SIZE: u32 = 5;
|
||||
const EDITOR_LEGACY_IMAGE_ASSET_KIND: &str = "image";
|
||||
// 透明图集最多产出 256 个切片,另有 provider 原图和透明整图两个正式 item。
|
||||
const EDITOR_GENERATION_RESULT_MAX_ITEMS: usize = 258;
|
||||
const EDITOR_GENERATION_OPERATION_KINDS: [&str; 12] = [
|
||||
"editor_image_generation",
|
||||
"editor_icon_spec_generation",
|
||||
"editor_image_edit",
|
||||
"editor_background_removal",
|
||||
"editor_icon_spritesheet_generation",
|
||||
"editor_ui_design_asset_extraction",
|
||||
"editor_character_animation_generation",
|
||||
"editor_video_generation",
|
||||
"editor_sound_effect_generation",
|
||||
"editor_background_music_generation",
|
||||
// Tripo 3D 的产物没有图片画布入口,但共用同一原子落库事务;不在这里登记就会被整笔拒绝。
|
||||
"model3d_text_to_model",
|
||||
"model3d_image_to_model",
|
||||
];
|
||||
// operation_kind 白名单由 shared-contracts 提供,入队方与这里共用同一份清单。
|
||||
use shared_contracts::EDITOR_GENERATION_OPERATION_KINDS;
|
||||
const EDITOR_CHARACTER_ANIMATION_ASSET_KIND: &str = "character-animation";
|
||||
const EDITOR_CHARACTER_ANIMATION_OBJECT_KIND: &str = "editor_character_animation";
|
||||
const EDITOR_CANVAS_LAYER_RESOURCE_METADATA_FIELDS: [&str; 12] = [
|
||||
|
||||
Reference in New Issue
Block a user