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