open_lark/service/search/v2/suite_search/
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::{SearchAppRequest, SearchMessageRequest, SearchResponse},
15};
16
17/// 套件搜索服务
18pub struct SuiteSearchService {
19    pub config: Config,
20}
21
22/// 搜索消息响应
23#[derive(Debug, Serialize, Deserialize)]
24pub struct SearchMessageResponse {
25    /// 搜索结果
26    #[serde(flatten)]
27    pub search_result: SearchResponse,
28}
29
30impl ApiResponseTrait for SearchMessageResponse {
31    fn data_format() -> ResponseFormat {
32        ResponseFormat::Data
33    }
34}
35
36/// 搜索应用响应
37#[derive(Debug, Serialize, Deserialize)]
38pub struct SearchAppResponse {
39    /// 搜索结果
40    #[serde(flatten)]
41    pub search_result: SearchResponse,
42}
43
44impl ApiResponseTrait for SearchAppResponse {
45    fn data_format() -> ResponseFormat {
46        ResponseFormat::Data
47    }
48}
49
50impl SuiteSearchService {
51    pub fn new(config: Config) -> Self {
52        Self { config }
53    }
54
55    /// 搜索消息
56    ///
57    /// 该接口用于搜索飞书平台内的消息内容。
58    ///
59    /// 注意事项:
60    /// - 需要申请相应权限
61    /// - 支持关键字模糊搜索
62    /// - 支持分页查询
63    ///
64    /// # 参数
65    ///
66    /// - `request`: 搜索消息请求参数
67    /// - `option`: 可选的请求配置
68    pub async fn search_message(
69        &self,
70        request: SearchMessageRequest,
71        option: Option<RequestOption>,
72    ) -> SDKResult<BaseResponse<SearchMessageResponse>> {
73        let mut api_req = ApiRequest {
74            http_method: Method::POST,
75            api_path: crate::core::endpoints::search::SEARCH_V2_MESSAGE.to_string(),
76            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
77            body: serde_json::to_vec(&request)?,
78            ..Default::default()
79        };
80
81        // 添加查询参数
82        if let Some(page_size) = request.page_size {
83            api_req
84                .query_params
85                .insert("page_size", page_size.to_string());
86        }
87        if let Some(page_token) = &request.page_token {
88            api_req
89                .query_params
90                .insert("page_token", page_token.clone());
91        }
92
93        Transport::request(api_req, &self.config, option).await
94    }
95
96    /// 搜索应用
97    ///
98    /// 该接口用于搜索飞书平台内的应用。
99    ///
100    /// 注意事项:
101    /// - 需要申请相应权限
102    /// - 支持应用名称模糊搜索
103    /// - 支持分页查询
104    ///
105    /// # 参数
106    ///
107    /// - `request`: 搜索应用请求参数
108    /// - `option`: 可选的请求配置
109    pub async fn search_app(
110        &self,
111        request: SearchAppRequest,
112        option: Option<RequestOption>,
113    ) -> SDKResult<BaseResponse<SearchAppResponse>> {
114        let mut api_req = ApiRequest {
115            http_method: Method::POST,
116            api_path: crate::core::endpoints::search::SEARCH_V2_APP.to_string(),
117            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
118            body: serde_json::to_vec(&request)?,
119            ..Default::default()
120        };
121
122        // 添加查询参数
123        if let Some(page_size) = request.page_size {
124            api_req
125                .query_params
126                .insert("page_size", page_size.to_string());
127        }
128        if let Some(page_token) = &request.page_token {
129            api_req
130                .query_params
131                .insert("page_token", page_token.clone());
132        }
133
134        Transport::request(api_req, &self.config, option).await
135    }
136}