Skip to main content

tdm_server_rust/entity/
gray_release.rs

1//! 灰度发布实体 (Gray Release Entities)
2//!
3//! 定义灰度功能配置、体验人员和前后端 API 传输对象。
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7use std::collections::BTreeMap;
8
9/// 灰度功能配置记录。
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct GrayFeatureRecord {
13    /// 功能唯一标识。
14    pub feature_key: String,
15    /// 功能展示名称。
16    pub feature_name: String,
17    /// 功能说明。
18    pub description: String,
19    /// 功能是否启用。
20    pub enabled: bool,
21    /// 灰度比例,0 到 10000 分别表示 0% 到 100%。
22    pub rollout_rate: i32,
23    /// 体验组员 ID 列表。
24    pub tester_member_ids: Vec<i32>,
25    /// 创建时间。
26    pub created_at: DateTime<Utc>,
27    /// 更新时间。
28    pub updated_at: DateTime<Utc>,
29}
30
31/// 灰度功能管理页展示项。
32#[derive(Debug, Clone, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct GrayFeatureAdminItem {
35    /// 功能唯一标识。
36    pub feature_key: String,
37    /// 功能展示名称。
38    pub feature_name: String,
39    /// 功能说明。
40    pub description: String,
41    /// 功能是否启用。
42    pub enabled: bool,
43    /// 灰度比例,0 到 10000 分别表示 0% 到 100%。
44    pub rollout_rate: i32,
45    /// 体验组员 ID 列表。
46    pub tester_member_ids: Vec<i32>,
47    /// 创建时间。
48    pub created_at: DateTime<Utc>,
49    /// 更新时间。
50    pub updated_at: DateTime<Utc>,
51}
52
53impl From<GrayFeatureRecord> for GrayFeatureAdminItem {
54    /// 将数据库记录转换为管理端展示项。
55    fn from(value: GrayFeatureRecord) -> Self {
56        Self {
57            feature_key: value.feature_key,
58            feature_name: value.feature_name,
59            description: value.description,
60            enabled: value.enabled,
61            rollout_rate: value.rollout_rate,
62            tester_member_ids: value.tester_member_ids,
63            created_at: value.created_at,
64            updated_at: value.updated_at,
65        }
66    }
67}
68
69/// 灰度功能更新请求。
70#[derive(Debug, Clone, Deserialize)]
71#[serde(rename_all = "camelCase")]
72pub struct GrayFeatureUpdateRequest {
73    /// 功能展示名称。
74    pub feature_name: String,
75    /// 功能说明。
76    pub description: String,
77    /// 功能是否启用。
78    pub enabled: bool,
79    /// 灰度比例,0 到 10000 分别表示 0% 到 100%。
80    pub rollout_rate: i32,
81    /// 体验组员 ID 列表。
82    #[serde(default)]
83    pub tester_member_ids: Vec<i32>,
84}
85
86/// 当前组员的灰度命中结果。
87#[derive(Debug, Clone, Serialize, Deserialize)]
88#[serde(rename_all = "camelCase")]
89pub struct GrayCurrentDecisionResponse {
90    /// 功能命中表,key 为功能标识,value 为是否进入灰度。
91    pub features: BTreeMap<String, bool>,
92}
93
94/// 单个功能的灰度判定结果。
95#[derive(Debug, Clone, PartialEq, Eq)]
96pub struct GrayFeatureDecision {
97    /// 是否进入灰度逻辑。
98    pub enabled: bool,
99    /// 命中的桶编号。
100    pub bucket: Option<u32>,
101    /// 判定原因。
102    pub reason: &'static str,
103}