open_lark/service/im/v1/message_reaction/
mod.rs

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5use crate::impl_full_service;
6use crate::{
7    core::{
8        api_req::ApiRequest,
9        api_resp::{ApiResponseTrait, BaseResponse, EmptyResponse, ResponseFormat},
10        config::Config,
11        constants::AccessTokenType,
12        endpoints::EndpointBuilder,
13        http::Transport,
14        req_option::RequestOption,
15        standard_response::StandardResponse,
16        SDKResult,
17    },
18    service::im::v1::models::{MessageReaction, UserIdType},
19};
20
21/// 表情回复服务
22pub struct MessageReactionService {
23    pub config: Config,
24}
25
26/// 添加表情回复请求
27#[derive(Debug, Serialize, Deserialize)]
28pub struct CreateReactionRequest {
29    /// 表情类型
30    pub emoji_type: String,
31}
32
33// 接入统一 Service 抽象(IM v1 - MessageReactionService)
34impl_full_service!(MessageReactionService, "im.message_reaction", "v1");
35
36/// 获取表情回复响应
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ListReactionResponse {
39    /// 表情回复列表
40    pub reactions: Vec<MessageReaction>,
41    /// 是否还有更多数据
42    pub has_more: bool,
43    /// 分页标记
44    pub page_token: Option<String>,
45}
46
47impl ApiResponseTrait for ListReactionResponse {
48    fn data_format() -> ResponseFormat {
49        ResponseFormat::Data
50    }
51}
52
53impl MessageReactionService {
54    pub fn new(config: Config) -> Self {
55        Self { config }
56    }
57    /// 添加消息表情回复
58    pub async fn create(
59        &self,
60        message_id: &str,
61        emoji_type: &str,
62        user_id_type: Option<UserIdType>,
63        option: Option<RequestOption>,
64    ) -> SDKResult<EmptyResponse> {
65        let mut query_params = HashMap::new();
66        if let Some(user_id_type) = user_id_type {
67            query_params.insert("user_id_type", user_id_type.as_str().to_string());
68        }
69
70        let api_req = ApiRequest {
71            http_method: Method::POST,
72            api_path: EndpointBuilder::replace_param(
73                crate::core::endpoints::im::IM_V1_MESSAGE_REACTIONS,
74                "message_id",
75                message_id,
76            ),
77            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
78            query_params,
79            body: serde_json::to_vec(&CreateReactionRequest {
80                emoji_type: emoji_type.to_string(),
81            })?,
82            ..Default::default()
83        };
84
85        let api_resp: BaseResponse<EmptyResponse> =
86            Transport::request(api_req, &self.config, option).await?;
87        api_resp.into_result()
88    }
89
90    /// 获取消息表情回复
91    pub async fn list(
92        &self,
93        message_id: &str,
94        user_id_type: Option<UserIdType>,
95        page_size: Option<i32>,
96        page_token: Option<String>,
97        option: Option<RequestOption>,
98    ) -> SDKResult<ListReactionResponse> {
99        let mut query_params = HashMap::new();
100        if let Some(user_id_type) = user_id_type {
101            query_params.insert("user_id_type", user_id_type.as_str().to_string());
102        }
103        if let Some(page_size) = page_size {
104            query_params.insert("page_size", page_size.to_string());
105        }
106        if let Some(page_token) = page_token {
107            query_params.insert("page_token", page_token);
108        }
109
110        let api_req = ApiRequest {
111            http_method: Method::GET,
112            api_path: EndpointBuilder::replace_param(
113                crate::core::endpoints::im::IM_V1_MESSAGE_REACTIONS,
114                "message_id",
115                message_id,
116            ),
117            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
118            query_params,
119            ..Default::default()
120        };
121
122        let api_resp: BaseResponse<ListReactionResponse> =
123            Transport::request(api_req, &self.config, option).await?;
124        api_resp.into_result()
125    }
126
127    /// 删除消息表情回复
128    pub async fn delete(
129        &self,
130        message_id: &str,
131        reaction_id: &str,
132        user_id_type: Option<UserIdType>,
133        option: Option<RequestOption>,
134    ) -> SDKResult<EmptyResponse> {
135        let mut query_params = HashMap::new();
136        if let Some(user_id_type) = user_id_type {
137            query_params.insert("user_id_type", user_id_type.as_str().to_string());
138        }
139
140        let api_req = ApiRequest {
141            http_method: Method::DELETE,
142            api_path: EndpointBuilder::replace_params_from_array(
143                crate::core::endpoints::im::IM_V1_DELETE_MESSAGE_REACTION,
144                &[("message_id", message_id), ("reaction_id", reaction_id)],
145            ),
146            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
147            query_params,
148            ..Default::default()
149        };
150
151        let api_resp: BaseResponse<EmptyResponse> =
152            Transport::request(api_req, &self.config, option).await?;
153        api_resp.into_result()
154    }
155}