Skip to main content

wekan_cli/client/boards/
card_settings.rs

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/// The complete v11.06 card-settings projection. Omission is distinct from null.
10#[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/// Partial settings update; omitted fields are never serialized.
119#[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}