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,