openlark_workflow/v2/tasklist/activity_subscription/
models.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
7#[serde(rename_all = "snake_case")]
8pub enum ActivitySubscriptionType {
9 #[default]
11 TaskCreated,
12 TaskUpdated,
14 TaskCompleted,
16 TaskDeleted,
18 CommentCreated,
20 MemberAdded,
22 MemberRemoved,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
28#[serde(rename_all = "snake_case")]
29pub enum ActivitySubscriptionTargetType {
30 #[default]
32 Webhook,
33 Chat,
35}
36
37#[derive(Debug, Clone, Serialize, Default)]
39pub struct CreateActivitySubscriptionBody {
40 pub subscription_type: ActivitySubscriptionType,
42
43 pub target_type: ActivitySubscriptionTargetType,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub target_url: Option<String>,
49
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub chat_id: Option<String>,
53}
54
55#[derive(Debug, Clone, Serialize, Default)]
57pub struct UpdateActivitySubscriptionBody {
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub subscription_type: Option<ActivitySubscriptionType>,
61
62 #[serde(skip_serializing_if = "Option::is_none")]
64 pub target_type: Option<ActivitySubscriptionTargetType>,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
68 pub target_url: Option<String>,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub chat_id: Option<String>,
73}
74
75#[derive(Debug, Clone, Deserialize)]
77pub struct ActivitySubscription {
78 pub subscription_guid: String,
80
81 pub subscription_type: ActivitySubscriptionType,
83
84 pub target_type: ActivitySubscriptionTargetType,
86
87 #[serde(default)]
89 pub target_url: Option<String>,
90
91 #[serde(default)]
93 pub chat_id: Option<String>,
94
95 pub created_at: String,
97
98 pub updated_at: String,
100}
101
102#[derive(Debug, Clone, Deserialize)]
104pub struct CreateActivitySubscriptionResponse {
105 pub subscription: ActivitySubscription,
107}
108
109#[derive(Debug, Clone, Deserialize)]
111pub struct GetActivitySubscriptionResponse {
112 pub subscription: ActivitySubscription,
114}
115
116#[derive(Debug, Clone, Deserialize)]
118pub struct UpdateActivitySubscriptionResponse {
119 pub subscription: ActivitySubscription,
121}
122
123#[derive(Debug, Clone, Deserialize)]
125pub struct DeleteActivitySubscriptionResponse {
126 pub success: bool,
128
129 pub subscription_guid: String,
131}
132
133#[derive(Debug, Clone, Deserialize)]
135pub struct ListActivitySubscriptionsResponse {
136 #[serde(default)]
138 pub has_more: bool,
139
140 #[serde(default)]
142 pub page_token: Option<String>,
143
144 #[serde(default)]
146 pub total: Option<i32>,
147
148 #[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 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 let json = r#"{"field": "data"}"#;
168 let value: serde_json::Value = serde_json::from_str(json).unwrap();
169 assert_eq!(value["field"], "data");
170 }
171}