1use reqwest::header::ACCEPT;
2use secrecy::{ExposeSecret, SecretString};
3use serde::{Deserialize, Serialize};
4use serde_json::Number;
5
6use super::{ClientError, WekanClient};
7use crate::client::transport::decode_success;
8
9#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
11#[serde(
12 deny_unknown_fields,
13 rename_all(deserialize = "camelCase", serialize = "snake_case")
14)]
15pub struct BoardCardSettings {
16 #[serde(default, deserialize_with = "optional")]
17 pub allows_card_counter_list: Option<bool>,
18 #[serde(default, deserialize_with = "optional")]
19 pub card_aging: Option<bool>,
20 #[serde(default, deserialize_with = "optional")]
21 pub allows_board_member_list: Option<bool>,
22 #[serde(default, deserialize_with = "optional")]
23 pub allows_show_lists: Option<bool>,
24 #[serde(default, deserialize_with = "optional")]
25 pub allows_attachments: Option<bool>,
26 #[serde(default, deserialize_with = "optional")]
27 pub allows_checklists: Option<bool>,
28 #[serde(default, deserialize_with = "optional")]
29 pub allows_comments: Option<bool>,
30 #[serde(default, deserialize_with = "optional")]
31 pub allows_description_title: Option<bool>,
32 #[serde(default, deserialize_with = "optional")]
33 pub allows_description_text: Option<bool>,
34 #[serde(default, deserialize_with = "optional")]
35 pub allows_activities: Option<bool>,
36 #[serde(default, deserialize_with = "optional")]
37 pub allows_labels: Option<bool>,
38 #[serde(default, deserialize_with = "optional")]
39 pub allows_creator: Option<bool>,
40 #[serde(default, deserialize_with = "optional")]
41 pub allows_assignee: Option<bool>,
42 #[serde(default, deserialize_with = "optional")]
43 pub allows_members: Option<bool>,
44 #[serde(default, deserialize_with = "optional")]
45 pub allows_requested_by: Option<bool>,
46 #[serde(default, deserialize_with = "optional")]
47 pub allows_card_sorting_by_number: Option<bool>,
48 #[serde(default, deserialize_with = "optional")]
49 pub allows_card_number: Option<bool>,
50 #[serde(default, deserialize_with = "optional")]
51 pub allows_assigned_by: Option<bool>,
52 #[serde(default, deserialize_with = "optional")]
53 pub allows_received_date: Option<bool>,
54 #[serde(default, deserialize_with = "optional")]
55 pub allows_start_date: Option<bool>,
56 #[serde(default, deserialize_with = "optional")]
57 pub allows_end_date: Option<bool>,
58 #[serde(default, deserialize_with = "optional")]
59 pub allows_due_date: Option<bool>,
60 #[serde(default, deserialize_with = "optional")]
61 pub allows_subtasks: Option<bool>,
62 #[serde(default, deserialize_with = "optional")]
63 pub allows_creator_on_minicard: Option<bool>,
64 #[serde(default, deserialize_with = "optional")]
65 pub allows_attachments_on_minicard: Option<bool>,
66 #[serde(default, deserialize_with = "optional")]
67 pub allows_checklists_on_minicard: Option<bool>,
68 #[serde(default, deserialize_with = "optional")]
69 pub allows_checklist_at_minicard: Option<bool>,
70 #[serde(default, deserialize_with = "optional")]
71 pub allows_cover_attachment_on_minicard: Option<bool>,
72 #[serde(default, deserialize_with = "optional")]
73 pub allows_badge_attachment_on_minicard: Option<bool>,
74 #[serde(default, deserialize_with = "optional")]
75 pub allows_card_sorting_by_number_on_minicard: Option<bool>,
76 #[serde(default, deserialize_with = "optional")]
77 pub allows_card_number_on_minicard: Option<bool>,
78 #[serde(default, deserialize_with = "optional")]
79 pub allows_description_title_on_minicard: Option<bool>,
80 #[serde(default, deserialize_with = "optional")]
81 pub allows_description_text_on_minicard: Option<bool>,
82 #[serde(default, deserialize_with = "optional")]
83 pub allows_labels_on_minicard: Option<bool>,
84 #[serde(default, deserialize_with = "optional")]
85 pub allows_assignee_on_minicard: Option<bool>,
86 #[serde(default, deserialize_with = "optional")]
87 pub allows_members_on_minicard: Option<bool>,
88 #[serde(default, deserialize_with = "optional")]
89 pub allows_requested_by_on_minicard: Option<bool>,
90 #[serde(default, deserialize_with = "optional")]
91 pub allows_assigned_by_on_minicard: Option<bool>,
92 #[serde(default, deserialize_with = "optional")]
93 pub allows_received_date_on_minicard: Option<bool>,
94 #[serde(default, deserialize_with = "optional")]
95 pub allows_start_date_on_minicard: Option<bool>,
96 #[serde(default, deserialize_with = "optional")]
97 pub allows_end_date_on_minicard: Option<bool>,
98 #[serde(default, deserialize_with = "optional")]
99 pub allows_due_date_on_minicard: Option<bool>,
100 #[serde(default, deserialize_with = "optional")]
101 pub allows_subtasks_on_minicard: Option<bool>,
102 #[serde(default, deserialize_with = "optional")]
103 pub allows_show_lists_on_minicard: Option<bool>,
104 #[serde(default, deserialize_with = "optional")]
105 pub card_aging_days1: Option<Number>,
106 #[serde(default, deserialize_with = "optional")]
107 pub card_aging_days2: Option<Number>,
108 #[serde(default, deserialize_with = "optional")]
109 pub card_aging_days3: Option<Number>,
110}
111
112fn optional<'de, D: serde::Deserializer<'de>, T: Deserialize<'de>>(
113 d: D,
114) -> Result<Option<T>, D::Error> {
115 T::deserialize(d).map(Some)
116}
117
118#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
120#[serde(rename_all = "camelCase")]
121pub struct UpdateBoardCardSettingsRequest {
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub allows_card_counter_list: Option<bool>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub card_aging: Option<bool>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub allows_board_member_list: Option<bool>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub allows_show_lists: Option<bool>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub allows_attachments: Option<bool>,
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub allows_checklists: Option<bool>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub allows_comments: Option<bool>,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub allows_description_title: Option<bool>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub allows_description_text: Option<bool>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub allows_activities: Option<bool>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub allows_labels: Option<bool>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub allows_creator: Option<bool>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub allows_assignee: Option<bool>,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub allows_members: Option<bool>,
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub allows_requested_by: Option<bool>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub allows_card_sorting_by_number: Option<bool>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub allows_card_number: Option<bool>,
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub allows_assigned_by: Option<bool>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub allows_received_date: Option<bool>,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub allows_start_date: Option<bool>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub allows_end_date: Option<bool>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub allows_due_date: Option<bool>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub allows_subtasks: Option<bool>,
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub allows_creator_on_minicard: Option<bool>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub allows_attachments_on_minicard: Option<bool>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub allows_checklists_on_minicard: Option<bool>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub allows_checklist_at_minicard: Option<bool>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub allows_cover_attachment_on_minicard: Option<bool>,
178 #[serde(skip_serializing_if = "Option::is_none")]
179 pub allows_badge_attachment_on_minicard: Option<bool>,
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub allows_card_sorting_by_number_on_minicard: Option<bool>,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub allows_card_number_on_minicard: Option<bool>,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub allows_description_title_on_minicard: Option<bool>,
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub allows_description_text_on_minicard: Option<bool>,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub allows_labels_on_minicard: Option<bool>,
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub allows_assignee_on_minicard: Option<bool>,
192 #[serde(skip_serializing_if = "Option::is_none")]
193 pub allows_members_on_minicard: Option<bool>,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub allows_requested_by_on_minicard: Option<bool>,
196 #[serde(skip_serializing_if = "Option::is_none")]
197 pub allows_assigned_by_on_minicard: Option<bool>,
198 #[serde(skip_serializing_if = "Option::is_none")]
199 pub allows_received_date_on_minicard: Option<bool>,
200 #[serde(skip_serializing_if = "Option::is_none")]
201 pub allows_start_date_on_minicard: Option<bool>,
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub allows_end_date_on_minicard: Option<bool>,
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub allows_due_date_on_minicard: Option<bool>,
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub allows_subtasks_on_minicard: Option<bool>,
208 #[serde(skip_serializing_if = "Option::is_none")]
209 pub allows_show_lists_on_minicard: Option<bool>,
210 #[serde(skip_serializing_if = "Option::is_none")]
211 pub card_aging_days1: Option<u64>,
212 #[serde(skip_serializing_if = "Option::is_none")]
213 pub card_aging_days2: Option<u64>,
214 #[serde(skip_serializing_if = "Option::is_none")]
215 pub card_aging_days3: Option<u64>,
216}
217
218impl WekanClient {
219 pub async fn board_card_settings(
220 &self,
221 board: &str,
222 token: &SecretString,
223 ) -> Result<BoardCardSettings, ClientError> {
224 super::members::validate_id(board)?;
225 let body = self
226 .execute_success_request(
227 self.http
228 .get(self.board_endpoint(board, Some("cardSettings"))?)
229 .header(ACCEPT, "application/json")
230 .bearer_auth(token.expose_secret()),
231 )
232 .await?;
233 decode_success(&body, "board card settings get", true)
234 }
235
236 pub async fn update_board_card_settings(
237 &self,
238 board: &str,
239 request: &UpdateBoardCardSettingsRequest,
240 token: &SecretString,
241 ) -> Result<BoardCardSettings, ClientError> {
242 super::members::validate_id(board)?;
243 let body = self
244 .execute_success_request(
245 self.http
246 .put(self.board_endpoint(board, Some("cardSettings"))?)
247 .header(ACCEPT, "application/json")
248 .bearer_auth(token.expose_secret())
249 .json(request),
250 )
251 .await?;
252 decode_success(&body, "board card settings update", true)
253 }
254}