open_lark/service/im/v2/app_feed_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};
15
16/// 应用消息流卡片服务
17pub struct AppFeedCardService {
18    pub config: Config,
19}
20
21/// 创建应用消息流卡片请求
22#[derive(Debug, Serialize, Deserialize)]
23pub struct CreateAppFeedCardRequest {
24    /// 卡片内容
25    pub card_content: Value,
26    /// 目标用户ID列表
27    pub target_users: Vec<String>,
28    /// 卡片标题
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub title: Option<String>,
31    /// 卡片描述
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub description: Option<String>,
34}
35
36/// 创建应用消息流卡片响应
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct CreateAppFeedCardResponse {
39    /// 卡片ID
40    pub card_id: String,
41    /// 创建时间
42    pub create_time: String,
43}
44
45impl ApiResponseTrait for CreateAppFeedCardResponse {
46    fn data_format() -> ResponseFormat {
47        ResponseFormat::Data
48    }
49}
50
51/// 更新应用消息流卡片请求
52#[derive(Debug, Serialize, Deserialize)]
53pub struct UpdateAppFeedCardRequest {
54    /// 卡片内容
55    pub card_content: Value,
56    /// 更新标题
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub title: Option<String>,
59    /// 更新描述
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub description: Option<String>,
62}
63
64/// 更新应用消息流卡片响应
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct UpdateAppFeedCardResponse {
67    /// 卡片ID
68    pub card_id: String,
69    /// 更新时间
70    pub update_time: String,
71}
72
73impl ApiResponseTrait for UpdateAppFeedCardResponse {
74    fn data_format() -> ResponseFormat {
75        ResponseFormat::Data
76    }
77}
78
79impl AppFeedCardService {
80    pub fn new(config: Config) -> Self {
81        Self { config }
82    }
83
84    /// 创建应用消息流卡片
85    pub async fn create(
86        &self,
87        request: CreateAppFeedCardRequest,
88        option: Option<RequestOption>,
89    ) -> SDKResult<BaseResponse<CreateAppFeedCardResponse>> {
90        let api_req = ApiRequest {
91            http_method: Method::POST,
92            api_path: crate::core::endpoints::im::IM_V2_APP_FEED_CARD.to_string(),
93            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
94            body: serde_json::to_vec(&request)?,
95            ..Default::default()
96        };
97
98        Transport::request(api_req, &self.config, option).await
99    }
100
101    /// 更新应用消息流卡片
102    pub async fn update(
103        &self,
104        card_id: &str,
105        request: UpdateAppFeedCardRequest,
106        option: Option<RequestOption>,
107    ) -> SDKResult<BaseResponse<UpdateAppFeedCardResponse>> {
108        let api_req = ApiRequest {
109            http_method: Method::PUT,
110            api_path: EndpointBuilder::replace_param(
111                crate::core::endpoints::im::IM_V2_GET_APP_FEED_CARD,
112                "card_id",
113                card_id,
114            ),
115            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
116            body: serde_json::to_vec(&request)?,
117            ..Default::default()
118        };
119
120        Transport::request(api_req, &self.config, option).await
121    }
122
123    /// 删除应用消息流卡片
124    pub async fn delete(
125        &self,
126        card_id: &str,
127        option: Option<RequestOption>,
128    ) -> SDKResult<BaseResponse<EmptyResponse>> {
129        let api_req = ApiRequest {
130            http_method: Method::DELETE,
131            api_path: EndpointBuilder::replace_param(
132                crate::core::endpoints::im::IM_V2_DELETE_APP_FEED_CARD,
133                "card_id",
134                card_id,
135            ),
136            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
137            ..Default::default()
138        };
139
140        Transport::request(api_req, &self.config, option).await
141    }
142}