Skip to main content

openlark_workflow/v2/tasklist/activity_subscription/
patch.rs

1//! 更新动态订阅
2//!
3//! docPath: https://open.feishu.cn/document/server-docs/docs/task-v2/tasklist-activity_subscription/patch
4
5use crate::common::{api_endpoints::TaskApiV2, api_utils::*};
6use crate::v2::tasklist::activity_subscription::models::{
7    ActivitySubscriptionTargetType, ActivitySubscriptionType, UpdateActivitySubscriptionBody,
8    UpdateActivitySubscriptionResponse,
9};
10use openlark_core::{
11    api::{ApiRequest, ApiResponseTrait, ResponseFormat},
12    config::Config,
13    validate_required, SDKResult,
14};
15use std::sync::Arc;
16
17/// 更新动态订阅请求
18#[derive(Debug, Clone)]
19pub struct UpdateActivitySubscriptionRequest {
20    /// 配置信息
21    config: Arc<Config>,
22    /// 任务清单 GUID
23    tasklist_guid: String,
24    /// 订阅 GUID
25    subscription_guid: String,
26    /// 请求体
27    body: UpdateActivitySubscriptionBody,
28}
29
30impl UpdateActivitySubscriptionRequest {
31    pub fn new(
32        config: Arc<Config>,
33        tasklist_guid: impl Into<String>,
34        subscription_guid: impl Into<String>,
35    ) -> Self {
36        Self {
37            config,
38            tasklist_guid: tasklist_guid.into(),
39            subscription_guid: subscription_guid.into(),
40            body: UpdateActivitySubscriptionBody::default(),
41        }
42    }
43
44    /// 设置订阅类型
45    pub fn subscription_type(mut self, subscription_type: ActivitySubscriptionType) -> Self {
46        self.body.subscription_type = Some(subscription_type);
47        self
48    }
49
50    /// 设置目标类型
51    pub fn target_type(mut self, target_type: ActivitySubscriptionTargetType) -> Self {
52        self.body.target_type = Some(target_type);
53        self
54    }
55
56    /// 设置目标 URL
57    pub fn target_url(mut self, target_url: impl Into<String>) -> Self {
58        self.body.target_url = Some(target_url.into());
59        self
60    }
61
62    /// 设置飞书群 ID
63    pub fn chat_id(mut self, chat_id: impl Into<String>) -> Self {
64        self.body.chat_id = Some(chat_id.into());
65        self
66    }
67
68    /// 执行请求
69    pub async fn execute(self) -> SDKResult<UpdateActivitySubscriptionResponse> {
70        self.execute_with_options(openlark_core::req_option::RequestOption::default())
71            .await
72    }
73
74    /// 执行请求(带选项)
75    pub async fn execute_with_options(
76        self,
77        option: openlark_core::req_option::RequestOption,
78    ) -> SDKResult<UpdateActivitySubscriptionResponse> {
79        // 验证必填字段
80        validate_required!(self.tasklist_guid.trim(), "任务清单GUID不能为空");
81        validate_required!(self.subscription_guid.trim(), "订阅GUID不能为空");
82
83        let api_endpoint = TaskApiV2::ActivitySubscriptionUpdate(
84            self.tasklist_guid.clone(),
85            self.subscription_guid.clone(),
86        );
87        let mut request =
88            ApiRequest::<UpdateActivitySubscriptionResponse>::patch(api_endpoint.to_url());
89
90        let request_body = &self.body;
91        request = request.body(serialize_params(request_body, "更新动态订阅")?);
92
93        let response =
94            openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
95        extract_response_data(response, "更新动态订阅")
96    }
97}
98
99impl ApiResponseTrait for UpdateActivitySubscriptionResponse {
100    fn data_format() -> ResponseFormat {
101        ResponseFormat::Data
102    }
103}
104
105#[cfg(test)]
106#[allow(unused_imports)]
107mod tests {
108    use std::sync::Arc;
109
110    use super::*;
111
112    #[test]
113    fn test_update_activity_subscription_builder() {
114        let config = Arc::new(
115            openlark_core::config::Config::builder()
116                .app_id("test")
117                .app_secret("test")
118                .build(),
119        );
120
121        let request =
122            UpdateActivitySubscriptionRequest::new(config, "tasklist_123", "subscription_456")
123                .subscription_type(ActivitySubscriptionType::TaskUpdated)
124                .target_type(ActivitySubscriptionTargetType::Chat)
125                .chat_id("chat_789");
126
127        assert_eq!(request.tasklist_guid, "tasklist_123");
128        assert_eq!(request.subscription_guid, "subscription_456");
129        assert_eq!(
130            request.body.subscription_type,
131            Some(ActivitySubscriptionType::TaskUpdated)
132        );
133        assert_eq!(
134            request.body.target_type,
135            Some(ActivitySubscriptionTargetType::Chat)
136        );
137        assert_eq!(request.body.chat_id, Some("chat_789".to_string()));
138    }
139
140    #[test]
141    fn test_activity_subscription_update_api_v2_url() {
142        let endpoint = TaskApiV2::ActivitySubscriptionUpdate(
143            "tasklist_123".to_string(),
144            "subscription_456".to_string(),
145        );
146        assert_eq!(
147            endpoint.to_url(),
148            "/open-apis/task/v2/tasklists/tasklist_123/activity_subscriptions/subscription_456"
149        );
150    }
151}