From 54d1df9d2110d4369a03437b8b62a28661a09725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sun, 4 Oct 2026 19:35:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=A5=91=E7=BA=A6):=20=E4=BC=9A?= =?UTF-8?q?=E5=91=98=20token=20=E6=9E=9A=E4=B8=BE=E8=B5=B0=20ts-rs=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=EF=BC=8C=E5=89=8D=E7=AB=AF=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E6=89=8B=E5=86=99=E8=81=94=E5=90=88=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - shared-contracts 给 ProfileMembershipPlanToken/CycleKindToken/StatusToken/ModelAccessToken/ChangeKindToken 补 ts_rs::TS + ts(export),生成 5 个 .ts 到 packages/shared/src/contracts/generated/(评审第 14 条) - packages/shared/src/contracts/runtime.ts 的 ProfileMembershipPlan/Status/CycleKind/ModelAccess 改为生成类型的别名并 re-export - apps/admin-web/src/api/adminApiTypes.ts 删除本地手写联合类型,改为从 @genarrative/shared 导入 / re-export - npm run check:generated-bindings、admin-web:typecheck、npm run typecheck 通过 --- apps/admin-web/src/api/adminApiTypes.ts | 24 ++++---- .../ProfileMembershipChangeKindToken.ts | 6 ++ .../ProfileMembershipCycleKindToken.ts | 6 ++ .../ProfileMembershipModelAccessToken.ts | 6 ++ .../generated/ProfileMembershipPlanToken.ts | 9 +++ .../generated/ProfileMembershipStatusToken.ts | 6 ++ packages/shared/src/contracts/runtime.ts | 28 ++++++---- .../crates/shared-contracts/src/runtime.rs | 55 +++++++++++++++++++ 8 files changed, 118 insertions(+), 22 deletions(-) create mode 100644 packages/shared/src/contracts/generated/ProfileMembershipChangeKindToken.ts create mode 100644 packages/shared/src/contracts/generated/ProfileMembershipCycleKindToken.ts create mode 100644 packages/shared/src/contracts/generated/ProfileMembershipModelAccessToken.ts create mode 100644 packages/shared/src/contracts/generated/ProfileMembershipPlanToken.ts create mode 100644 packages/shared/src/contracts/generated/ProfileMembershipStatusToken.ts diff --git a/apps/admin-web/src/api/adminApiTypes.ts b/apps/admin-web/src/api/adminApiTypes.ts index ceb6db413..65fe26188 100644 --- a/apps/admin-web/src/api/adminApiTypes.ts +++ b/apps/admin-web/src/api/adminApiTypes.ts @@ -1,3 +1,9 @@ +import type { + ProfileMembershipCycleKind, + ProfileMembershipModelAccess, + ProfileMembershipPlan, +} from '@genarrative/shared'; + export interface ApiMeta { apiVersion?: string; requestId?: string; @@ -381,18 +387,12 @@ export type ProfileRedeemCodeMode = 'public' | 'unique' | 'private'; export type ProfileTaskCycle = 'daily'; export type TrackingScopeKind = 'site' | 'work' | 'module' | 'user'; export type ProfileRechargeProductKind = 'points' | 'membership'; -/** 会员档位:`normal` 是非会员占位档位,不可购买。 */ -export type ProfileMembershipPlan = - | 'normal' - | 'starter' - | 'plus' - | 'pro' - | 'max'; -/** 会员周期:有效期内不支持月年互换。 */ -export type ProfileMembershipCycleKind = 'monthly' | 'yearly'; -/** 模型权限:`basic` 仅基础模型,`full` 基础及高性能模型。 */ -export type ProfileMembershipModelAccess = 'basic' | 'full'; - +/** 会员档位 / 周期 / 权限:统一来自 `@genarrative/shared` 的生成类型,禁止手写字面量。 */ +export type { + ProfileMembershipCycleKind, + ProfileMembershipModelAccess, + ProfileMembershipPlan, +}; export interface AdminTrackingEventListQuery { eventKey?: string; userId?: string; diff --git a/packages/shared/src/contracts/generated/ProfileMembershipChangeKindToken.ts b/packages/shared/src/contracts/generated/ProfileMembershipChangeKindToken.ts new file mode 100644 index 000000000..ea6b35979 --- /dev/null +++ b/packages/shared/src/contracts/generated/ProfileMembershipChangeKindToken.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 会员订单权益变更类型 token;区分“新购”与“补差升级”。 + */ +export type ProfileMembershipChangeKindToken = "purchase" | "upgrade"; diff --git a/packages/shared/src/contracts/generated/ProfileMembershipCycleKindToken.ts b/packages/shared/src/contracts/generated/ProfileMembershipCycleKindToken.ts new file mode 100644 index 000000000..878043568 --- /dev/null +++ b/packages/shared/src/contracts/generated/ProfileMembershipCycleKindToken.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 会员购买周期 token;与前端 `ProfileMembershipCycleKind` 一一对应。 + */ +export type ProfileMembershipCycleKindToken = "monthly" | "yearly"; diff --git a/packages/shared/src/contracts/generated/ProfileMembershipModelAccessToken.ts b/packages/shared/src/contracts/generated/ProfileMembershipModelAccessToken.ts new file mode 100644 index 000000000..1c3f3f95f --- /dev/null +++ b/packages/shared/src/contracts/generated/ProfileMembershipModelAccessToken.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 模型权限 token;与前端 `ProfileMembershipModelAccess` 一一对应。 + */ +export type ProfileMembershipModelAccessToken = "basic" | "full"; diff --git a/packages/shared/src/contracts/generated/ProfileMembershipPlanToken.ts b/packages/shared/src/contracts/generated/ProfileMembershipPlanToken.ts new file mode 100644 index 000000000..03de552cd --- /dev/null +++ b/packages/shared/src/contracts/generated/ProfileMembershipPlanToken.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 会员档位 token;与前端 `ProfileMembershipPlan` 联合类型一一对应。 + * + * 用枚举而非 `String` 收口 wire 值:未知 token 在反序列化阶段即被拒绝,后台也不能再 + * 写入任意档位字符串。 + */ +export type ProfileMembershipPlanToken = "normal" | "starter" | "plus" | "pro" | "max"; diff --git a/packages/shared/src/contracts/generated/ProfileMembershipStatusToken.ts b/packages/shared/src/contracts/generated/ProfileMembershipStatusToken.ts new file mode 100644 index 000000000..f2b14056e --- /dev/null +++ b/packages/shared/src/contracts/generated/ProfileMembershipStatusToken.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 会员状态 token;与前端 `ProfileMembershipStatus` 联合类型一一对应。 + */ +export type ProfileMembershipStatusToken = "normal" | "active"; diff --git a/packages/shared/src/contracts/runtime.ts b/packages/shared/src/contracts/runtime.ts index 3638f075a..d8bafe63e 100644 --- a/packages/shared/src/contracts/runtime.ts +++ b/packages/shared/src/contracts/runtime.ts @@ -1,7 +1,19 @@ import type { JsonObject } from './common'; +import type { ProfileMembershipChangeKindToken } from './generated/ProfileMembershipChangeKindToken'; +import type { ProfileMembershipCycleKindToken } from './generated/ProfileMembershipCycleKindToken'; +import type { ProfileMembershipModelAccessToken } from './generated/ProfileMembershipModelAccessToken'; +import type { ProfileMembershipPlanToken } from './generated/ProfileMembershipPlanToken'; +import type { ProfileMembershipStatusToken } from './generated/ProfileMembershipStatusToken'; import type { ProfileMudPointBalanceResponse as ProfileMudPointBalance } from './generated/ProfileMudPointBalanceResponse'; -export type { ProfileMudPointBalance }; +export type { + ProfileMembershipChangeKindToken, + ProfileMembershipCycleKindToken, + ProfileMembershipModelAccessToken, + ProfileMembershipPlanToken, + ProfileMembershipStatusToken, + ProfileMudPointBalance, +}; export const SAVE_SNAPSHOT_VERSION = 2; export const DEFAULT_MUSIC_VOLUME = 0.42; @@ -120,18 +132,14 @@ export type ExternalApiKeyMutationResponse = { }; export type ProfileRechargeProductKind = 'points' | 'membership'; -export type ProfileMembershipStatus = 'normal' | 'active'; +/** 会员状态:来源 Rust `ProfileMembershipStatusToken`,禁止手工维护字面量。 */ +export type ProfileMembershipStatus = ProfileMembershipStatusToken; /** 会员档位:`normal` 是非会员占位档位,不可购买。 */ -export type ProfileMembershipPlan = - | 'normal' - | 'starter' - | 'plus' - | 'pro' - | 'max'; +export type ProfileMembershipPlan = ProfileMembershipPlanToken; /** 会员周期:有效期内不支持月年互换,到期后重新选择。 */ -export type ProfileMembershipCycleKind = 'monthly' | 'yearly'; +export type ProfileMembershipCycleKind = ProfileMembershipCycleKindToken; /** 模型权限:`basic` 仅基础模型,`full` 基础及高性能模型。 */ -export type ProfileMembershipModelAccess = 'basic' | 'full'; +export type ProfileMembershipModelAccess = ProfileMembershipModelAccessToken; export type ProfileRechargeOrderStatus = | 'pending' | 'paid' diff --git a/server-rs/crates/shared-contracts/src/runtime.rs b/server-rs/crates/shared-contracts/src/runtime.rs index 3e7f3e3db..d9b0b88b2 100644 --- a/server-rs/crates/shared-contracts/src/runtime.rs +++ b/server-rs/crates/shared-contracts/src/runtime.rs @@ -252,6 +252,17 @@ pub struct ProfileWalletLedgerResponse { /// 写入任意档位字符串。 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] +#[cfg_attr(feature = "ts-bindings", derive(ts_rs::TS))] +#[cfg_attr( + feature = "ts-bindings", + ts( + export, + export_to = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/generated/" + ) + ) +)] pub enum ProfileMembershipPlanToken { Normal, Starter, @@ -275,6 +286,17 @@ impl ProfileMembershipPlanToken { /// 会员购买周期 token;与前端 `ProfileMembershipCycleKind` 一一对应。 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] +#[cfg_attr(feature = "ts-bindings", derive(ts_rs::TS))] +#[cfg_attr( + feature = "ts-bindings", + ts( + export, + export_to = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/generated/" + ) + ) +)] pub enum ProfileMembershipCycleKindToken { Monthly, Yearly, @@ -292,6 +314,17 @@ impl ProfileMembershipCycleKindToken { /// 会员状态 token;与前端 `ProfileMembershipStatus` 联合类型一一对应。 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] +#[cfg_attr(feature = "ts-bindings", derive(ts_rs::TS))] +#[cfg_attr( + feature = "ts-bindings", + ts( + export, + export_to = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/generated/" + ) + ) +)] pub enum ProfileMembershipStatusToken { Normal, Active, @@ -309,6 +342,17 @@ impl ProfileMembershipStatusToken { /// 模型权限 token;与前端 `ProfileMembershipModelAccess` 一一对应。 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] +#[cfg_attr(feature = "ts-bindings", derive(ts_rs::TS))] +#[cfg_attr( + feature = "ts-bindings", + ts( + export, + export_to = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/generated/" + ) + ) +)] pub enum ProfileMembershipModelAccessToken { Basic, Full, @@ -326,6 +370,17 @@ impl ProfileMembershipModelAccessToken { /// 会员订单权益变更类型 token;区分“新购”与“补差升级”。 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] +#[cfg_attr(feature = "ts-bindings", derive(ts_rs::TS))] +#[cfg_attr( + feature = "ts-bindings", + ts( + export, + export_to = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/generated/" + ) + ) +)] pub enum ProfileMembershipChangeKindToken { Purchase, Upgrade,