Skip to main content

openlark_workflow/v2/tasklist/activity_subscription/
models.rs

1//! 动态订阅数据模型
2
3use serde::{Deserialize, Serialize};
4
5/// 动态订阅类型
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
7#[serde(rename_all = "snake_case")]
8pub enum ActivitySubscriptionType {
9    /// 任务创建
10    #[default]
11    TaskCreated,
12    /// 任务更新
13    TaskUpdated,
14    /// 任务完成
15    TaskCompleted,
16    /// 任务删除
17    TaskDeleted,
18    /// 评论创建
19    CommentCreated,
20    /// 成员添加
21    MemberAdded,
22    /// 成员移除
23    MemberRemoved,
24}
25
26/// 动态订阅目标类型
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
28#[serde(rename_all = "snake_case")]
29pub enum ActivitySubscriptionTargetType {
30    /// Webhook
31    #[default]
32    Webhook,
33    /// 飞书群
34    Chat,
35}
36
37/// 创建动态订阅请求体
38#[derive(Debug, Clone, Serialize, Default)]
39pub struct CreateActivitySubscriptionBody {
40    /// 订阅类型
41    pub subscription_type: ActivitySubscriptionType,
42
43    /// 目标类型
44    pub target_type: ActivitySubscriptionTargetType,
45
46    /// 目标 URL(当 target_type 为 webhook 时)
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub target_url: Option<String>,
49
50    /// 飞书群 ID(当 target_type 为 chat 时)
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub chat_id: Option<String>,
53}
54
55/// 更新动态订阅请求体
56#[derive(Debug, Clone, Serialize, Default)]
57pub struct UpdateActivitySubscriptionBody {
58    /// 订阅类型
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub subscription_type: Option<ActivitySubscriptionType>,
61
62    /// 目标类型
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub target_type: Option<ActivitySubscriptionTargetType>,
65
66    /// 目标 URL
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub target_url: Option<String>,
69
70    /// 飞书群 ID
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub chat_id: Option<String>,
73}
74
75/// 动态订阅信息
76#[derive(Debug, Clone, Deserialize)]
77pub struct ActivitySubscription {
78    /// 订阅 GUID
79    pub subscription_guid: String,
80
81    /// 订阅类型
82    pub subscription_type: ActivitySubscriptionType,
83
84    /// 目标类型
85    pub target_type: ActivitySubscriptionTargetType,
86
87    /// 目标 URL
88    #[serde(default)]
89    pub target_url: Option<String>,
90
91    /// 飞书群 ID
92    #[serde(default)]
93    pub chat_id: Option<String>,
94
95    /// 创建时间
96    pub created_at: String,
97
98    /// 更新时间
99    pub updated_at: String,
100}
101
102/// 创建动态订阅响应
103#[derive(Debug, Clone, Deserialize)]
104pub struct CreateActivitySubscriptionResponse {
105    /// 订阅信息
106    pub subscription: ActivitySubscription,
107}
108
109/// 获取动态订阅响应
110#[derive(Debug, Clone, Deserialize)]
111pub struct GetActivitySubscriptionResponse {
112    /// 订阅信息
113    pub subscription: ActivitySubscription,
114}
115
116/// 更新动态订阅响应
117#[derive(Debug, Clone, Deserialize)]
118pub struct UpdateActivitySubscriptionResponse {
119    /// 订阅信息
120    pub subscription: ActivitySubscription,
121}
122
123/// 删除动态订阅响应
124#[derive(Debug, Clone, Deserialize)]
125pub struct DeleteActivitySubscriptionResponse {
126    /// 是否删除成功
127    pub success: bool,
128
129    /// 订阅 GUID
130    pub subscription_guid: String,
131}
132
133/// 列取动态订阅响应
134#[derive(Debug, Clone, Deserialize)]
135pub struct ListActivitySubscriptionsResponse {
136    /// 是否还有更多项
137    #[serde(default)]
138    pub has_more: bool,
139
140    /// 分页标记
141    #[serde(default)]
142    pub page_token: Option<String>,
143
144    /// 总数
145    #[serde(default)]
146    pub total: Option<i32>,
147
148    /// 订阅列表
149    #[serde(default)]
150    pub items: Vec<ActivitySubscription>,
151}
152
153#[cfg(test)]
154#[allow(unused_imports)]
155mod tests {
156
157    #[test]
158    fn test_serialization_roundtrip() {
159        // 基础序列化测试
160        let json = r#"{"test": "value"}"#;
161        assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
162    }
163
164    #[test]
165    fn test_deserialization_from_json() {
166        // 基础反序列化测试
167        let json = r#"{"field": "data"}"#;
168        let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
169        assert_eq!(value["field"], "data");
170    }
171}