diff --git a/server-rs/crates/api-server/src/modules/game_distribution_publish.rs b/server-rs/crates/api-server/src/modules/game_distribution_publish.rs index 1dbd1a5e6..0cf7d2202 100644 --- a/server-rs/crates/api-server/src/modules/game_distribution_publish.rs +++ b/server-rs/crates/api-server/src/modules/game_distribution_publish.rs @@ -131,6 +131,9 @@ async fn publish_version_core( let payload: NewGameVersionRequest = serde_json::from_value(metadata).map_err(|_| bad_request("metadata 字段不合法"))?; let project_key = normalize_project_key(payload.project_key.as_deref())?; + // `projectKey` 只是**创建作品**的身份锚:`POST /games` 无路径槽时用它派生 `gameId` 并落作品行; + // 追加版本走路径 `{game_id}`,既不回退到(owner, projectKey)找作品,也不把 key 写进版本行。 + let is_create_path = matches!(&target, PublishTarget::NewGame); let requested_version_number = match &target { PublishTarget::NewGame => 1, PublishTarget::ExistingVersion { version_number, .. } => *version_number, @@ -225,7 +228,13 @@ async fn publish_version_core( let input = GameDistributionPublishVersionRecordInput { game_id: game_id.clone(), owner_user_id, - project_key: project_key.clone(), + // 只有创建作品那一次把 `projectKey` 落进作品行(模块 get-or-create 用);追加版本一律 None, + // 避免版本行的 `project_key` 与作品行、自然键三方各说各话。 + project_key: if is_create_path { + project_key.clone() + } else { + None + }, version_id, version_number, metadata_json,