open_lark/service/cloud_docs/drive/v1/
event.rs

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    core::{
6        api_req::ApiRequest,
7        api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8        config::Config,
9        constants::AccessTokenType,
10        endpoints::cloud_docs::*,
11        http::Transport,
12        req_option::RequestOption,
13        SDKResult,
14    },
15    impl_executable_builder_owned,
16};
17
18/// 事件订阅服务
19pub struct EventService {
20    config: Config,
21}
22
23impl EventService {
24    pub fn new(config: Config) -> Self {
25        Self { config }
26    }
27
28    /// 订阅云文档事件
29    ///
30    /// 该接口用于订阅云文档的相关事件。
31    ///
32    /// <https://open.feishu.cn/document/server-docs/docs/drive-v1/event-subscription/create>
33    pub async fn subscribe_file_events(
34        &self,
35        request: SubscribeFileEventsRequest,
36        option: Option<RequestOption>,
37    ) -> SDKResult<BaseResponse<SubscribeFileEventsRespData>> {
38        let api_req = ApiRequest {
39            http_method: Method::POST,
40            api_path: DRIVE_V1_FILES_SUBSCRIBE.to_string(),
41            supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
42            body: serde_json::to_vec(&request)?,
43            ..Default::default()
44        };
45
46        let api_resp = Transport::request(api_req, &self.config, option).await?;
47        Ok(api_resp)
48    }
49
50    /// 查询云文档事件订阅状态
51    ///
52    /// 该接口用于查询云文档的事件订阅状态。
53    ///
54    /// <https://open.feishu.cn/document/server-docs/docs/drive-v1/event-subscription/get>
55    pub async fn get_file_subscription(
56        &self,
57        request: GetFileSubscriptionRequest,
58        option: Option<RequestOption>,
59    ) -> SDKResult<BaseResponse<GetFileSubscriptionRespData>> {
60        let mut api_req = ApiRequest {
61            http_method: Method::GET,
62            api_path: DRIVE_V1_FILE_SUBSCRIPTIONS
63                .replace("{}", &request.file_token)
64                .replace("{}", &request.subscription_id),
65            ..Default::default()
66        };
67        api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
68
69        let api_resp = Transport::request(api_req, &self.config, option).await?;
70        Ok(api_resp)
71    }
72
73    /// 取消云文档事件订阅
74    ///
75    /// 该接口用于取消云文档的事件订阅。
76    ///
77    /// <https://open.feishu.cn/document/server-docs/docs/drive-v1/event-subscription/delete>
78    pub async fn unsubscribe_file_events(
79        &self,
80        request: UnsubscribeFileEventsRequest,
81        option: Option<RequestOption>,
82    ) -> SDKResult<BaseResponse<UnsubscribeFileEventsRespData>> {
83        let mut api_req = ApiRequest {
84            http_method: Method::DELETE,
85            api_path: DRIVE_V1_FILE_SUBSCRIPTIONS
86                .replace("{}", &request.file_token)
87                .replace("{}", &request.subscription_id),
88            ..Default::default()
89        };
90        api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
91
92        let api_resp = Transport::request(api_req, &self.config, option).await?;
93        Ok(api_resp)
94    }
95}
96
97/// 订阅云文档事件请求参数
98#[derive(Debug, Clone, Serialize, Deserialize, Default)]
99pub struct SubscribeFileEventsRequest {
100    /// 文件token
101    pub file_token: String,
102    /// 文件类型
103    pub file_type: String,
104    /// 事件类型列表
105    pub event_types: Vec<String>,
106}
107
108impl SubscribeFileEventsRequest {
109    pub fn builder() -> SubscribeFileEventsRequestBuilder {
110        SubscribeFileEventsRequestBuilder::default()
111    }
112
113    pub fn new(
114        file_token: impl Into<String>,
115        file_type: impl Into<String>,
116        event_types: Vec<String>,
117    ) -> Self {
118        Self {
119            file_token: file_token.into(),
120            file_type: file_type.into(),
121            event_types,
122        }
123    }
124}
125
126/// 订阅云文档事件请求构建器
127#[derive(Default)]
128pub struct SubscribeFileEventsRequestBuilder {
129    request: SubscribeFileEventsRequest,
130}
131
132impl SubscribeFileEventsRequestBuilder {
133    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
134        self.request.file_token = file_token.into();
135        self
136    }
137
138    pub fn file_type(mut self, file_type: impl Into<String>) -> Self {
139        self.request.file_type = file_type.into();
140        self
141    }
142
143    pub fn event_types(mut self, event_types: Vec<String>) -> Self {
144        self.request.event_types = event_types;
145        self
146    }
147
148    pub fn add_event_type(mut self, event_type: impl Into<String>) -> Self {
149        self.request.event_types.push(event_type.into());
150        self
151    }
152
153    pub fn build(self) -> SubscribeFileEventsRequest {
154        self.request
155    }
156}
157
158impl_executable_builder_owned!(
159    SubscribeFileEventsRequestBuilder,
160    EventService,
161    SubscribeFileEventsRequest,
162    BaseResponse<SubscribeFileEventsRespData>,
163    subscribe_file_events
164);
165
166/// 订阅云文档事件响应数据
167#[derive(Debug, Clone, Serialize, Deserialize)]
168pub struct SubscribeFileEventsRespData {
169    /// 订阅ID
170    pub subscription_id: String,
171    /// 订阅类型
172    pub subscription_type: String,
173}
174
175impl ApiResponseTrait for SubscribeFileEventsRespData {
176    fn data_format() -> ResponseFormat {
177        ResponseFormat::Data
178    }
179}
180
181/// 查询云文档事件订阅状态请求参数
182#[derive(Debug, Clone, Serialize, Deserialize, Default)]
183pub struct GetFileSubscriptionRequest {
184    /// 文件token
185    pub file_token: String,
186    /// 订阅ID
187    pub subscription_id: String,
188}
189
190impl GetFileSubscriptionRequest {
191    pub fn builder() -> GetFileSubscriptionRequestBuilder {
192        GetFileSubscriptionRequestBuilder::default()
193    }
194
195    pub fn new(file_token: impl Into<String>, subscription_id: impl Into<String>) -> Self {
196        Self {
197            file_token: file_token.into(),
198            subscription_id: subscription_id.into(),
199        }
200    }
201}
202
203/// 查询云文档事件订阅状态请求构建器
204#[derive(Default)]
205pub struct GetFileSubscriptionRequestBuilder {
206    request: GetFileSubscriptionRequest,
207}
208
209impl GetFileSubscriptionRequestBuilder {
210    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
211        self.request.file_token = file_token.into();
212        self
213    }
214
215    pub fn subscription_id(mut self, subscription_id: impl Into<String>) -> Self {
216        self.request.subscription_id = subscription_id.into();
217        self
218    }
219
220    pub fn build(self) -> GetFileSubscriptionRequest {
221        self.request
222    }
223}
224
225impl_executable_builder_owned!(
226    GetFileSubscriptionRequestBuilder,
227    EventService,
228    GetFileSubscriptionRequest,
229    BaseResponse<GetFileSubscriptionRespData>,
230    get_file_subscription
231);
232
233/// 查询云文档事件订阅状态响应数据
234#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct GetFileSubscriptionRespData {
236    /// 订阅信息
237    pub subscription: FileSubscription,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize)]
241pub struct FileSubscription {
242    /// 订阅ID
243    pub subscription_id: String,
244    /// 文件token
245    pub file_token: String,
246    /// 文件类型
247    pub file_type: String,
248    /// 事件类型列表
249    pub event_types: Vec<String>,
250    /// 订阅状态
251    pub is_active: bool,
252}
253
254impl ApiResponseTrait for GetFileSubscriptionRespData {
255    fn data_format() -> ResponseFormat {
256        ResponseFormat::Data
257    }
258}
259
260/// 取消云文档事件订阅请求参数
261#[derive(Debug, Clone, Serialize, Deserialize, Default)]
262pub struct UnsubscribeFileEventsRequest {
263    /// 文件token
264    pub file_token: String,
265    /// 订阅ID
266    pub subscription_id: String,
267}
268
269impl UnsubscribeFileEventsRequest {
270    pub fn builder() -> UnsubscribeFileEventsRequestBuilder {
271        UnsubscribeFileEventsRequestBuilder::default()
272    }
273
274    pub fn new(file_token: impl Into<String>, subscription_id: impl Into<String>) -> Self {
275        Self {
276            file_token: file_token.into(),
277            subscription_id: subscription_id.into(),
278        }
279    }
280}
281
282/// 取消云文档事件订阅请求构建器
283#[derive(Default)]
284pub struct UnsubscribeFileEventsRequestBuilder {
285    request: UnsubscribeFileEventsRequest,
286}
287
288impl UnsubscribeFileEventsRequestBuilder {
289    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
290        self.request.file_token = file_token.into();
291        self
292    }
293
294    pub fn subscription_id(mut self, subscription_id: impl Into<String>) -> Self {
295        self.request.subscription_id = subscription_id.into();
296        self
297    }
298
299    pub fn build(self) -> UnsubscribeFileEventsRequest {
300        self.request
301    }
302}
303
304impl_executable_builder_owned!(
305    UnsubscribeFileEventsRequestBuilder,
306    EventService,
307    UnsubscribeFileEventsRequest,
308    BaseResponse<UnsubscribeFileEventsRespData>,
309    unsubscribe_file_events
310);
311
312/// 取消云文档事件订阅响应数据
313#[derive(Debug, Clone, Serialize, Deserialize)]
314pub struct UnsubscribeFileEventsRespData {
315    /// 操作结果
316    pub result: bool,
317}
318
319impl ApiResponseTrait for UnsubscribeFileEventsRespData {
320    fn data_format() -> ResponseFormat {
321        ResponseFormat::Data
322    }
323}