refactor(契约): 会员 token 枚举走 ts-rs 生成,前端不再手写联合类型

- 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 通过
This commit is contained in:
2026-10-04 19:35:28 +08:00
parent 3a955889f0
commit 54d1df9d21
8 changed files with 118 additions and 22 deletions
+12 -12
View File
@@ -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;
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
+18 -10
View File
@@ -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'
@@ -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,