open_lark/service/im/v2/app_feed_card/
mod.rs1use 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
16pub struct AppFeedCardService {
18 pub config: Config,
19}
20
21#[derive(Debug, Serialize, Deserialize)]
23pub struct CreateAppFeedCardRequest {
24 pub card_content: Value,
26 pub target_users: Vec<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub title: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub description: Option<String>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct CreateAppFeedCardResponse {
39 pub card_id: String,
41 pub create_time: String,
43}
44
45impl ApiResponseTrait for CreateAppFeedCardResponse {
46 fn data_format() -> ResponseFormat {
47 ResponseFormat::Data
48 }
49}
50
51#[derive(Debug, Serialize, Deserialize)]
53pub struct UpdateAppFeedCardRequest {
54 pub card_content: Value,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub title: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub description: Option<String>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct UpdateAppFeedCardResponse {
67 pub card_id: String,
69 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 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 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 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}