Files
Genarrative/server-rs/crates/module-game-distribution/src/commands.rs
T
suzmii 3aa3e33ceb
Project CI / AI game creator shell Rust crates (pull_request) Failing after 56s
Project CI / Backend tests (pull_request) Failing after 23s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 5m7s
Project CI / Repository checks (pull_request) Failing after 21s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
实现统一项目发行版本
以 projectVersion 作为 AGC 唯一用户版本,支持同版本重复提交和版本回退。

保留 publicationRevision 并发校验与旧客户端自动递增兼容。
2026-10-03 16:41:04 +08:00

57 lines
1.8 KiB
Rust

use serde::{Deserialize, Serialize};
use crate::domain::normalize_id;
use crate::errors::GameDistributionFieldError;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct IdempotencyRequest {
pub key: String,
pub request_digest: String,
}
impl IdempotencyRequest {
pub fn validate(&self) -> Result<(), GameDistributionFieldError> {
if normalize_id(&self.key).is_none() {
return Err(GameDistributionFieldError::MissingIdempotencyKey);
}
if normalize_id(&self.request_digest).is_none() {
return Err(GameDistributionFieldError::MissingRequestDigest);
}
Ok(())
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct CreateGameInput {
pub game_id: String,
pub owner_user_id: String,
pub idempotency: IdempotencyRequest,
pub created_at_micros: i64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct CreateVersionInput {
pub game_id: String,
pub owner_user_id: String,
pub version_id: String,
/// 用户可见的正整数版本标签;`None` 时按该游戏已有最大版本号 +1(旧客户端兼容)。
/// 传入时只要求 `>= 1`:同一 gameId 的同一标签可以反复提交,每次都是一条新版本记录。
#[serde(default, skip_serializing_if = "Option::is_none")]
pub version_number: Option<u64>,
pub package_sha256: String,
pub package_bytes: u64,
pub idempotency: IdempotencyRequest,
pub created_at_micros: i64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReviewDecision {
Approve {
expected_publication_revision: u64,
},
Reject {
expected_publication_revision: u64,
reason: String,
},
}