refactor(后台契约): 会员详情 plan/status/cycle_kind 收口为 token 枚举

- shared-contracts 新增 ProfileMembershipStatusToken(normal/active)
- AdminProfileMembershipPayload 的 plan/status/cycle_kind 由 String 改为 ProfileMembershipPlanToken/ProfileMembershipStatusToken/ProfileMembershipCycleKindToken,未知值在反序列化即被拒(评审第 13 条)
- module-runtime 补 RuntimeProfileMembershipStatus -> ProfileMembershipStatusToken 的 From 映射
- api-server 的 map_membership 改为直接 .into(),去掉 as_str().to_string()
This commit is contained in:
2026-10-04 19:14:31 +08:00
parent bd06e42690
commit 3a955889f0
4 changed files with 35 additions and 6 deletions
@@ -1014,9 +1014,9 @@ fn map_membership_order_change(
fn map_membership(record: RuntimeProfileMembershipRecord) -> AdminProfileMembershipPayload {
AdminProfileMembershipPayload {
plan: record.plan.as_str().to_string(),
status: record.status.as_str().to_string(),
cycle_kind: record.cycle_kind.as_str().to_string(),
plan: record.plan.into(),
status: record.status.into(),
cycle_kind: record.cycle_kind.into(),
cycle_index: record.cycle_index,
cycle_count: record.cycle_count,
cycle_granted_points: record.cycle_granted_points,
@@ -1423,6 +1423,17 @@ impl From<shared_contracts::runtime::ProfileMembershipCycleKindToken>
}
}
impl From<RuntimeProfileMembershipStatus>
for shared_contracts::runtime::ProfileMembershipStatusToken
{
fn from(value: RuntimeProfileMembershipStatus) -> Self {
match value {
RuntimeProfileMembershipStatus::Normal => Self::Normal,
RuntimeProfileMembershipStatus::Active => Self::Active,
}
}
}
impl From<RuntimeProfileMembershipModelAccess>
for shared_contracts::runtime::ProfileMembershipModelAccessToken
{
@@ -5,6 +5,7 @@ use serde_json::Value;
use crate::runtime::{
ProfileMembershipChangeKindToken, ProfileMembershipCycleKindToken, ProfileMembershipPlanToken,
ProfileMembershipStatusToken,
};
#[cfg(any())]
@@ -1335,9 +1336,9 @@ pub struct AdminUserDetailResponse {
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AdminProfileMembershipPayload {
pub plan: String,
pub status: String,
pub cycle_kind: String,
pub plan: ProfileMembershipPlanToken,
pub status: ProfileMembershipStatusToken,
pub cycle_kind: ProfileMembershipCycleKindToken,
pub cycle_index: u32,
pub cycle_count: u32,
pub cycle_granted_points: u64,
@@ -289,6 +289,23 @@ impl ProfileMembershipCycleKindToken {
}
}
/// 会员状态 token;与前端 `ProfileMembershipStatus` 联合类型一一对应。
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ProfileMembershipStatusToken {
Normal,
Active,
}
impl ProfileMembershipStatusToken {
pub fn as_str(&self) -> &'static str {
match self {
Self::Normal => "normal",
Self::Active => "active",
}
}
}
/// 模型权限 token;与前端 `ProfileMembershipModelAccess` 一一对应。
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]