Skip to main content

openlark_workflow/v2/tasklist/activity_subscription/
create.rs

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