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

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use crate::core::{
6    api_req::ApiRequest,
7    api_resp::{ApiResponseTrait, BaseResponse, EmptyResponse, ResponseFormat},
8    config::Config,
9    constants::AccessTokenType,
10    endpoints::EndpointBuilder,
11    http::Transport,
12    req_option::RequestOption,
13    SDKResult,
14};
15use crate::impl_full_service;
16
17/// 消息卡片服务
18pub struct MessageCardService {
19    pub config: Config,
20}
21
22/// 更新消息卡片请求
23#[derive(Debug, Serialize, Deserialize)]
24pub struct PatchMessageCardRequest {
25    /// 卡片内容
26    pub card: Value,
27    /// 令牌
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub token: Option<String>,
30}
31
32// 接入统一 Service 抽象(IM v1 - MessageCardService)
33impl_full_service!(MessageCardService, "im.message_card", "v1");
34
35/// 延时更新消息卡片请求
36#[derive(Debug, Serialize, Deserialize)]
37pub struct DelayUpdateMessageCardRequest {
38    /// 延时时间(秒)
39    pub delay: i32,
40    /// 卡片内容
41    pub card: Value,
42    /// 令牌
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub token: Option<String>,
45}
46
47/// 发送仅特定人可见的消息卡片请求
48#[derive(Debug, Serialize, Deserialize)]
49pub struct SendVisibleMessageCardRequest {
50    /// 可见用户ID列表
51    pub open_ids: Vec<String>,
52    /// 卡片内容
53    pub card: Value,
54}
55
56/// 发送仅特定人可见的消息卡片响应
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct SendVisibleMessageCardResponse {
59    /// 消息ID
60    pub message_id: String,
61}
62
63impl ApiResponseTrait for SendVisibleMessageCardResponse {
64    fn data_format() -> ResponseFormat {
65        ResponseFormat::Data
66    }
67}
68
69impl MessageCardService {
70    pub fn new(config: Config) -> Self {
71        Self { config }
72    }
73
74    /// 更新应用发送的消息卡片
75    pub async fn patch(
76        &self,
77        message_id: &str,
78        request: PatchMessageCardRequest,
79        option: Option<RequestOption>,
80    ) -> SDKResult<BaseResponse<EmptyResponse>> {
81        let api_req = ApiRequest {
82            http_method: Method::PATCH,
83            api_path: EndpointBuilder::replace_param(
84                crate::core::endpoints::im::IM_V1_UPDATE_MESSAGE,
85                "message_id",
86                message_id,
87            ),
88            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
89            body: serde_json::to_vec(&request)?,
90            ..Default::default()
91        };
92
93        Transport::request(api_req, &self.config, option).await
94    }
95
96    /// 延时更新消息卡片
97    pub async fn delay_update(
98        &self,
99        message_id: &str,
100        request: DelayUpdateMessageCardRequest,
101        option: Option<RequestOption>,
102    ) -> SDKResult<BaseResponse<EmptyResponse>> {
103        let api_req = ApiRequest {
104            http_method: Method::POST,
105            api_path: EndpointBuilder::replace_param(
106                crate::core::endpoints::im::IM_V1_MESSAGE_DELAY_UPDATE,
107                "message_id",
108                message_id,
109            ),
110            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
111            body: serde_json::to_vec(&request)?,
112            ..Default::default()
113        };
114
115        Transport::request(api_req, &self.config, option).await
116    }
117
118    /// 发送仅特定人可见的消息卡片
119    pub async fn send_visible(
120        &self,
121        message_id: &str,
122        request: SendVisibleMessageCardRequest,
123        option: Option<RequestOption>,
124    ) -> SDKResult<BaseResponse<SendVisibleMessageCardResponse>> {
125        let api_req = ApiRequest {
126            http_method: Method::POST,
127            api_path: EndpointBuilder::replace_param(
128                crate::core::endpoints::im::IM_V1_MESSAGE_URGENT_APP,
129                "message_id",
130                message_id,
131            ),
132            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
133            body: serde_json::to_vec(&request)?,
134            ..Default::default()
135        };
136
137        Transport::request(api_req, &self.config, option).await
138    }
139
140    /// 删除仅特定人可见的消息卡片
141    pub async fn delete_visible(
142        &self,
143        message_id: &str,
144        open_ids: Vec<String>,
145        option: Option<RequestOption>,
146    ) -> SDKResult<BaseResponse<EmptyResponse>> {
147        let request = serde_json::json!({
148            "open_ids": open_ids
149        });
150
151        let api_req = ApiRequest {
152            http_method: Method::DELETE,
153            api_path: EndpointBuilder::replace_param(
154                crate::core::endpoints::im::IM_V1_MESSAGE_URGENT_APP,
155                "message_id",
156                message_id,
157            ),
158            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
159            body: serde_json::to_vec(&request)?,
160            ..Default::default()
161        };
162
163        Transport::request(api_req, &self.config, option).await
164    }
165}