From 454ed320a5f6d91491290fe2f2a615b07df3e155 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sat, 3 Oct 2026 14:34:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=A1=E6=A0=B8=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20revision=20=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 审核队列与版本快照使用所属游戏当前 publication_revision,避免新游戏审核通过时误携带 0。 详情审核动作使用最新详情 revision,并补充后台回归测试。 --- .../AdminGameDistributionReviewPage.test.tsx | 14 +++++++++++++- .../pages/AdminGameDistributionReviewPage.tsx | 16 ++++++++++++++-- .../api-server/src/modules/game_distribution.rs | 1 + .../spacetime-module/src/game_distribution.rs | 14 ++++++++------ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx index 013603ed9..8d312eeb0 100644 --- a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx +++ b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx @@ -68,7 +68,7 @@ const detailResponse: AdminGameDistributionVersionDetailResponse = { inputModes: ['keyboard'], orientation: 'landscape', status: 'unpublished', - publicationRevision: 4, + publicationRevision: 7, playCount: 0, createdAt: '2026-09-20T08:00:00Z', }, @@ -293,4 +293,16 @@ test('详情展示发布者和冻结资料,并试玩当前待审版本', async 'http://127.0.0.1:8082/api/game-distribution/admin-previews/preview-1/', ); expect(frame.getAttribute('sandbox')).toBe('allow-scripts'); + fireEvent.click(screen.getByRole('button', { name: '通过' })); + await waitFor(() => + expect(reviewAdminGameDistributionVersion).toHaveBeenCalledWith( + 'admin-token', + 'version-1', + expect.any(String), + expect.objectContaining({ + decision: 'approve', + expectedPublicationRevision: 7, + }), + ), + ); }); diff --git a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx index 42911fe55..65d084ed6 100644 --- a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx +++ b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx @@ -348,12 +348,24 @@ export function AdminGameDistributionReviewPage({ onBack={closeDetails} onPreview={() => void startPreview()} onReject={() => { + const expectedEntry = detail + ? { + ...selectedEntry, + publicationRevision: detail.game.publicationRevision, + } + : selectedEntry; closeDetails(); - openReasonPrompt(selectedEntry, 'reject'); + openReasonPrompt(expectedEntry, 'reject'); }} onApprove={() => { + const expectedEntry = detail + ? { + ...selectedEntry, + publicationRevision: detail.game.publicationRevision, + } + : selectedEntry; closeDetails(); - void submitReview(selectedEntry, 'approve'); + void submitReview(expectedEntry, 'approve'); }} /> ); diff --git a/server-rs/crates/api-server/src/modules/game_distribution.rs b/server-rs/crates/api-server/src/modules/game_distribution.rs index 631299e80..6b1dbe3bf 100644 --- a/server-rs/crates/api-server/src/modules/game_distribution.rs +++ b/server-rs/crates/api-server/src/modules/game_distribution.rs @@ -2929,6 +2929,7 @@ fn private_version_payload(version: &GameDistributionVersionRecord) -> Value { }) } + /// 游戏分发写入开关。 /// /// 运营在灰度配置里把 `game-distribution:publish` 收紧后,作者写入与新版本激活会返回 diff --git a/server-rs/crates/spacetime-module/src/game_distribution.rs b/server-rs/crates/spacetime-module/src/game_distribution.rs index 502582030..9dffd2367 100644 --- a/server-rs/crates/spacetime-module/src/game_distribution.rs +++ b/server-rs/crates/spacetime-module/src/game_distribution.rs @@ -3286,7 +3286,7 @@ fn list_game_distribution_reviews_tx( versions.truncate(limit); Ok(versions .iter() - .map(game_distribution_version_snapshot) + .map(|version| game_distribution_version_snapshot_for_game(ctx, version)) .collect()) } @@ -3356,7 +3356,9 @@ fn list_owner_game_distribution_games_tx( GameDistributionOwnerGameSnapshot { versions: versions .iter() - .map(|version| game_distribution_version_snapshot(version)) + .map(|version| { + game_distribution_version_snapshot(version, game.publication_revision) + }) .collect(), game: game_distribution_game_snapshot(&game), } @@ -3716,6 +3718,7 @@ pub(crate) fn game_distribution_asset_has_public_read_grant( fn game_distribution_version_snapshot( version: &GameDistributionVersion, + publication_revision: u64, ) -> GameDistributionVersionSnapshot { GameDistributionVersionSnapshot { version_id: version.version_id.clone(), @@ -3729,7 +3732,7 @@ fn game_distribution_version_snapshot( status: version.status.clone(), review_reason: version.review_reason.clone(), entry_url: version.entry_url.clone(), - publication_revision: 0, + publication_revision, created_at_micros: version.created_at.to_micros_since_unix_epoch(), updated_at_micros: version.updated_at.to_micros_since_unix_epoch(), metadata_json: version.metadata_json.clone(), @@ -3740,15 +3743,14 @@ fn game_distribution_version_snapshot_for_game( ctx: &ReducerContext, version: &GameDistributionVersion, ) -> GameDistributionVersionSnapshot { - let mut snapshot = game_distribution_version_snapshot(version); - snapshot.publication_revision = ctx + let publication_revision = ctx .db .game_distribution_game() .game_id() .find(&version.game_id) .map(|game| game.publication_revision) .unwrap_or_default(); - snapshot + game_distribution_version_snapshot(version, publication_revision) } fn public_game_distribution_version(