open_lark/service/search/v2/data_source/
mod.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    service::search::v2::models::{
15        CreateDataSourceRequest, DataSource, ListDataSourceRequest, ListDataSourceResponse,
16        UpdateDataSourceRequest,
17    },
18};
19
20/// 数据源服务
21pub struct DataSourceService {
22    pub config: Config,
23}
24
25/// 创建数据源响应
26#[derive(Debug, Serialize, Deserialize)]
27pub struct CreateDataSourceResponse {
28    /// 数据源信息
29    pub data_source: DataSource,
30}
31
32impl ApiResponseTrait for CreateDataSourceResponse {
33    fn data_format() -> ResponseFormat {
34        ResponseFormat::Data
35    }
36}
37
38/// 获取数据源响应
39#[derive(Debug, Serialize, Deserialize)]
40pub struct GetDataSourceResponse {
41    /// 数据源信息
42    pub data_source: DataSource,
43}
44
45impl ApiResponseTrait for GetDataSourceResponse {
46    fn data_format() -> ResponseFormat {
47        ResponseFormat::Data
48    }
49}
50
51/// 更新数据源响应
52#[derive(Debug, Serialize, Deserialize)]
53pub struct UpdateDataSourceResponse {
54    /// 数据源信息
55    pub data_source: DataSource,
56}
57
58impl ApiResponseTrait for UpdateDataSourceResponse {
59    fn data_format() -> ResponseFormat {
60        ResponseFormat::Data
61    }
62}
63
64/// 空响应(用于删除等操作)
65#[derive(Debug, Serialize, Deserialize)]
66pub struct EmptyDataSourceResponse {}
67
68impl ApiResponseTrait for EmptyDataSourceResponse {
69    fn data_format() -> ResponseFormat {
70        ResponseFormat::Data
71    }
72}
73
74impl ApiResponseTrait for ListDataSourceResponse {
75    fn data_format() -> ResponseFormat {
76        ResponseFormat::Data
77    }
78}
79
80impl DataSourceService {
81    pub fn new(config: Config) -> Self {
82        Self { config }
83    }
84
85    /// 创建数据源
86    ///
87    /// 该接口用于创建搜索连接器的数据源。
88    ///
89    /// 注意事项:
90    /// - 需要申请相应权限
91    /// - 数据源名称需要唯一
92    ///
93    /// # 参数
94    ///
95    /// - `request`: 创建数据源请求参数
96    /// - `option`: 可选的请求配置
97    pub async fn create(
98        &self,
99        request: CreateDataSourceRequest,
100        option: Option<RequestOption>,
101    ) -> SDKResult<BaseResponse<CreateDataSourceResponse>> {
102        let api_req = ApiRequest {
103            http_method: Method::POST,
104            api_path: "/open-apis/search/v2/data_sources".to_string(),
105            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
106            body: serde_json::to_vec(&request)?,
107            ..Default::default()
108        };
109
110        Transport::request(api_req, &self.config, option).await
111    }
112
113    /// 删除数据源
114    ///
115    /// 该接口用于删除指定的数据源。
116    ///
117    /// # 参数
118    ///
119    /// - `data_source_id`: 数据源ID
120    /// - `option`: 可选的请求配置
121    pub async fn delete(
122        &self,
123        data_source_id: &str,
124        option: Option<RequestOption>,
125    ) -> SDKResult<BaseResponse<EmptyDataSourceResponse>> {
126        let api_req = ApiRequest {
127            http_method: Method::DELETE,
128            api_path: format!("/open-apis/search/v2/data_sources/{data_source_id}"),
129            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
130            ..Default::default()
131        };
132
133        Transport::request(api_req, &self.config, option).await
134    }
135
136    /// 修改数据源
137    ///
138    /// 该接口用于修改指定数据源的信息。
139    ///
140    /// # 参数
141    ///
142    /// - `data_source_id`: 数据源ID
143    /// - `request`: 更新数据源请求参数
144    /// - `option`: 可选的请求配置
145    pub async fn patch(
146        &self,
147        data_source_id: &str,
148        request: UpdateDataSourceRequest,
149        option: Option<RequestOption>,
150    ) -> SDKResult<BaseResponse<UpdateDataSourceResponse>> {
151        let api_req = ApiRequest {
152            http_method: Method::PATCH,
153            api_path: format!("/open-apis/search/v2/data_sources/{data_source_id}"),
154            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
155            body: serde_json::to_vec(&request)?,
156            ..Default::default()
157        };
158
159        Transport::request(api_req, &self.config, option).await
160    }
161
162    /// 获取数据源
163    ///
164    /// 该接口用于获取指定数据源的详细信息。
165    ///
166    /// # 参数
167    ///
168    /// - `data_source_id`: 数据源ID
169    /// - `option`: 可选的请求配置
170    pub async fn get(
171        &self,
172        data_source_id: &str,
173        option: Option<RequestOption>,
174    ) -> SDKResult<BaseResponse<GetDataSourceResponse>> {
175        let api_req = ApiRequest {
176            http_method: Method::GET,
177            api_path: format!("/open-apis/search/v2/data_sources/{data_source_id}"),
178            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
179            ..Default::default()
180        };
181
182        Transport::request(api_req, &self.config, option).await
183    }
184
185    /// 批量获取数据源
186    ///
187    /// 该接口用于批量获取数据源列表。
188    ///
189    /// # 参数
190    ///
191    /// - `request`: 查询参数(可选)
192    /// - `option`: 可选的请求配置
193    pub async fn list(
194        &self,
195        request: Option<ListDataSourceRequest>,
196        option: Option<RequestOption>,
197    ) -> SDKResult<BaseResponse<ListDataSourceResponse>> {
198        let mut api_req = ApiRequest {
199            http_method: Method::GET,
200            api_path: "/open-apis/search/v2/data_sources".to_string(),
201            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
202            ..Default::default()
203        };
204
205        // 如果有查询参数,添加到URL中
206        if let Some(req) = request {
207            if let Some(page_size) = req.page_size {
208                api_req
209                    .query_params
210                    .insert("page_size".to_string(), page_size.to_string());
211            }
212            if let Some(page_token) = req.page_token {
213                api_req
214                    .query_params
215                    .insert("page_token".to_string(), page_token);
216            }
217        }
218
219        Transport::request(api_req, &self.config, option).await
220    }
221}