Skip to main content

wekan_cli/client/
metadata.rs

1//! Shared stored metadata returned by native v12.57 resource reads.
2use serde::{Deserialize, Deserializer, Serialize};
3use serde_json::Number;
4use std::collections::BTreeMap;
5fn required_nullable<'de, D: Deserializer<'de>, T: Deserialize<'de>>(
6    d: D,
7) -> Result<Option<T>, D::Error> {
8    Option::deserialize(d)
9}
10/// Wekan v12.57: models/lib/scrum.js.
11#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12#[serde(
13    deny_unknown_fields,
14    rename_all(deserialize = "camelCase", serialize = "snake_case")
15)]
16pub struct ScrumSettings {
17    pub enabled: Option<bool>,
18    pub product_goal: Option<String>,
19    pub definition_of_done: Option<String>,
20    pub estimate_source: Option<String>,
21    pub estimate_custom_field_id: Option<String>,
22    pub estimate_unit: Option<String>,
23    pub completion_policy: Option<String>,
24    pub product_owner_id: Option<String>,
25    pub scrum_master_id: Option<String>,
26    pub developer_ids: Option<Vec<String>>,
27    pub working_days: Option<Vec<u8>>,
28    pub visibility: Option<ScrumVisibility>,
29}
30/// Wekan v12.57: models/lib/scrum.js.
31#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
32#[serde(
33    deny_unknown_fields,
34    rename_all(deserialize = "camelCase", serialize = "snake_case")
35)]
36pub struct ScrumVisibility {
37    pub card_sprint: Option<bool>,
38    pub card_past_sprints: Option<bool>,
39    pub card_release: Option<bool>,
40    pub card_issue_type: Option<bool>,
41    pub card_acceptance_criteria: Option<bool>,
42    pub card_backlog_rank: Option<bool>,
43    pub minicard_sprint: Option<bool>,
44    pub minicard_past_sprints: Option<bool>,
45    pub minicard_release: Option<bool>,
46    pub minicard_issue_type: Option<bool>,
47    pub minicard_acceptance_criteria: Option<bool>,
48    pub minicard_backlog_rank: Option<bool>,
49    pub list_category: Option<bool>,
50    pub swimlane_sprint: Option<bool>,
51    pub swimlane_release: Option<bool>,
52    pub swimlane_purpose: Option<bool>,
53}
54/// Wekan v12.57: models/lib/scrum.js.
55#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
56#[serde(
57    deny_unknown_fields,
58    rename_all(deserialize = "camelCase", serialize = "snake_case")
59)]
60pub struct ScrumCard {
61    pub sprint_id: Option<String>,
62    pub past_sprint_ids: Option<Vec<String>>,
63    pub backlog_rank: Option<Number>,
64    pub release_id: Option<String>,
65    pub release_ids: Option<Vec<String>>,
66    pub issue_type: Option<String>,
67    pub acceptance_criteria: Option<String>,
68}
69/// Wekan v12.57: models/lib/scrum.js.
70#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
71#[serde(
72    deny_unknown_fields,
73    rename_all(deserialize = "camelCase", serialize = "snake_case")
74)]
75pub struct ScrumList {
76    pub category: Option<String>,
77}
78/// Wekan v12.57: models/lib/scrum.js.
79#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
80#[serde(
81    deny_unknown_fields,
82    rename_all(deserialize = "camelCase", serialize = "snake_case")
83)]
84pub struct ScrumSwimlane {
85    pub sprint_id: Option<String>,
86    pub release_id: Option<String>,
87    pub purpose: Option<String>,
88}
89/// Wekan v12.57: models/lib/scrumTransfer.js.
90#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
91#[serde(
92    deny_unknown_fields,
93    rename_all(deserialize = "camelCase", serialize = "snake_case")
94)]
95pub struct ScrumImportLoss {
96    pub path: String,
97    pub source_id: String,
98    pub reason: String,
99}
100/// Wekan v12.57: models/boards.js.
101#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102#[serde(
103    deny_unknown_fields,
104    rename_all(deserialize = "camelCase", serialize = "snake_case")
105)]
106pub struct BoardAnnouncement {
107    pub enabled: Option<bool>,
108    pub body: Option<String>,
109    pub updated_at: Option<String>,
110}
111/// Wekan v12.57: models/boards.js.
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
113#[serde(
114    deny_unknown_fields,
115    rename_all(deserialize = "camelCase", serialize = "snake_case")
116)]
117pub struct BoardWipGroup {
118    #[serde(rename(deserialize = "_id", serialize = "id"))]
119    pub id: String,
120    pub name: Option<String>,
121    pub list_ids: Vec<String>,
122    pub limit: Number,
123    pub enabled: bool,
124}
125/// Wekan v12.57: models/lib/columnSets.js.
126#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
127#[serde(
128    deny_unknown_fields,
129    rename_all(deserialize = "camelCase", serialize = "snake_case")
130)]
131pub struct BoardColumnSet {
132    #[serde(rename(deserialize = "_id", serialize = "id"))]
133    pub id: String,
134    pub name: String,
135    pub columns: Vec<BoardColumn>,
136}
137/// Wekan v12.57: models/lib/columnSets.js.
138#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
139#[serde(
140    deny_unknown_fields,
141    rename_all(deserialize = "camelCase", serialize = "snake_case")
142)]
143pub struct BoardColumn {
144    #[serde(rename(deserialize = "_id", serialize = "id"))]
145    pub id: String,
146    pub title: String,
147    pub color: String,
148}
149/// Wekan v12.57: models/lib/emailToCard.js.
150#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
151#[serde(
152    deny_unknown_fields,
153    rename_all(deserialize = "camelCase", serialize = "snake_case")
154)]
155pub struct EmailParts {
156    pub description: Option<String>,
157    pub strip_quoted: Option<bool>,
158    pub attachments: Option<bool>,
159    pub sender_line: Option<bool>,
160}
161/// Wekan v12.57: models/lib/emailToCard.js.
162#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
163#[serde(
164    deny_unknown_fields,
165    rename_all(deserialize = "camelCase", serialize = "snake_case")
166)]
167pub struct BoardEmailToCard {
168    pub enabled: Option<bool>,
169    pub list_id: Option<String>,
170    pub swimlane_id: Option<String>,
171    pub parts: Option<EmailParts>,
172}
173/// Wekan v12.57: models/lib/emailToCard.js.
174#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175#[serde(
176    deny_unknown_fields,
177    rename_all(deserialize = "camelCase", serialize = "snake_case")
178)]
179pub struct MemberEmailToCard {
180    pub enabled: Option<bool>,
181    pub parts: Option<EmailParts>,
182}
183/// Wekan v12.57: models/lib/notificationDelivery.js.
184#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
185#[serde(
186    deny_unknown_fields,
187    rename_all(deserialize = "camelCase", serialize = "snake_case")
188)]
189pub struct NotificationDelivery {
190    pub email: Option<NotificationChannel>,
191    pub tray: Option<NotificationChannel>,
192    pub webhook: Option<WebhookDelivery>,
193}
194/// Wekan v12.57: models/lib/notificationDelivery.js.
195#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
196#[serde(
197    deny_unknown_fields,
198    rename_all(deserialize = "camelCase", serialize = "snake_case")
199)]
200pub struct MemberNotificationDelivery {
201    pub email: Option<NotificationChannel>,
202    pub tray: Option<NotificationChannel>,
203}
204/// Wekan v12.57: models/lib/notificationDelivery.js.
205#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
206#[serde(
207    deny_unknown_fields,
208    rename_all(deserialize = "camelCase", serialize = "snake_case")
209)]
210pub struct NotificationChannel {
211    pub layout: Option<String>,
212    pub parts: Option<Vec<String>>,
213    pub grouping: Option<String>,
214    pub schedule: Option<String>,
215    pub interval_minutes: Option<Number>,
216    pub daily_time: Option<String>,
217    pub quiet_start: Option<String>,
218    pub quiet_end: Option<String>,
219    pub timezone: Option<String>,
220}
221/// Wekan v12.57: models/lib/notificationDelivery.js.
222#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
223#[serde(
224    deny_unknown_fields,
225    rename_all(deserialize = "camelCase", serialize = "snake_case")
226)]
227pub struct WebhookDelivery {
228    pub text: Option<bool>,
229    pub fields: Option<Vec<String>>,
230    pub grouping: Option<String>,
231    pub schedule: Option<String>,
232    pub interval_minutes: Option<Number>,
233    pub daily_time: Option<String>,
234    pub quiet_start: Option<String>,
235    pub quiet_end: Option<String>,
236    pub timezone: Option<String>,
237}
238/// Wekan v12.57: models/lib/chatView.js.
239#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
240#[serde(
241    deny_unknown_fields,
242    rename_all(deserialize = "camelCase", serialize = "snake_case")
243)]
244pub struct ChatViewLayout {
245    pub tree_width: Number,
246    pub chat_width: Number,
247    pub tree_collapsed: bool,
248    pub card_collapsed: bool,
249    pub chat_collapsed: bool,
250}
251/// Wekan v12.57: server/models/dependencies.js.
252#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
253#[serde(
254    deny_unknown_fields,
255    rename_all(deserialize = "camelCase", serialize = "snake_case")
256)]
257pub struct PersonalDependency {
258    pub board_id: String,
259    pub card_id: String,
260    pub target_card_id: String,
261    pub r#type: String,
262    pub color: Option<String>,
263    pub icon: Option<String>,
264}
265/// Wekan v12.57: models/cards.js.
266#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
267#[serde(
268    deny_unknown_fields,
269    rename_all(deserialize = "camelCase", serialize = "snake_case")
270)]
271pub struct CardCustomFieldLink {
272    pub card_id: String,
273    pub mode: String,
274    pub user_id: String,
275    pub created_at: Option<String>,
276}
277/// Wekan v12.57: server/emailToCard.js, server/emailView.js.
278#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
279#[serde(
280    deny_unknown_fields,
281    rename_all(deserialize = "camelCase", serialize = "snake_case")
282)]
283pub struct CardEmail {
284    pub direction: String,
285    #[serde(rename(deserialize = "from", serialize = "sender"))]
286    #[serde(deserialize_with = "required_nullable")]
287    pub sender: Option<EmailSender>,
288    pub to: Vec<String>,
289    pub cc: Vec<String>,
290    pub subject: String,
291    #[serde(deserialize_with = "required_nullable")]
292    pub message_id: Option<String>,
293    pub thread_ids: Vec<String>,
294    pub at: String,
295}
296/// Wekan v12.57: server/emailToCard.js.
297#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
298#[serde(
299    deny_unknown_fields,
300    rename_all(deserialize = "camelCase", serialize = "snake_case")
301)]
302pub struct EmailSender {
303    pub name: String,
304    pub address: String,
305}
306/// Wekan v12.57: models/lib/cardDrawing.js, server/methods/whiteboard.js.
307#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
308#[serde(
309    deny_unknown_fields,
310    rename_all(deserialize = "camelCase", serialize = "snake_case")
311)]
312pub struct CardDrawing {
313    #[serde(rename(deserialize = "_id", serialize = "id"))]
314    pub id: String,
315    pub strokes: Vec<DrawingStroke>,
316    pub width: Number,
317    pub height: Number,
318    pub png_attachment_id: Option<String>,
319    pub updated_at: Option<String>,
320}
321/// Wekan v12.57: models/lib/cardDrawing.js.
322#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
323#[serde(
324    deny_unknown_fields,
325    rename_all(deserialize = "camelCase", serialize = "snake_case")
326)]
327pub struct DrawingStroke {
328    #[serde(rename(deserialize = "_id", serialize = "id"))]
329    pub id: Option<String>,
330    pub user_id: Option<String>,
331    pub color: String,
332    pub width: Number,
333    pub points: Vec<[Number; 2]>,
334}
335/// Wekan v12.57: models/lib/listPermissions.js.
336#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337#[serde(
338    deny_unknown_fields,
339    rename_all(deserialize = "camelCase", serialize = "snake_case")
340)]
341pub struct ListRoleException {
342    pub write: Option<bool>,
343    pub comment: Option<bool>,
344}
345/// Wekan v12.57: models/lists.js.
346#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
347#[serde(
348    deny_unknown_fields,
349    rename_all(deserialize = "camelCase", serialize = "snake_case")
350)]
351pub struct ListSyncSource {
352    pub r#type: Option<String>,
353    pub url: Option<String>,
354    pub project_key: Option<String>,
355    pub time_mapping_identities: Option<BTreeMap<String, String>>,
356    pub estimate_custom_field_id: Option<String>,
357    pub estimate_mapping_identity: Option<String>,
358    pub estimate_source_field: Option<String>,
359    pub fields: Option<Vec<String>>,
360    pub create_cards: Option<bool>,
361    pub archive_cards: Option<bool>,
362    pub issue_details: Option<bool>,
363    pub write_back: Option<bool>,
364    pub write_back_since: Option<String>,
365    pub enabled: Option<bool>,
366    pub last_synced_at: Option<String>,
367    pub last_sync_error: Option<String>,
368}
369/// Wekan v12.57: models/cards.js.
370#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371#[serde(
372    deny_unknown_fields,
373    rename_all(deserialize = "camelCase", serialize = "snake_case")
374)]
375pub struct CardSyncLastSource {
376    pub title: Option<String>,
377    pub description: Option<String>,
378    pub estimate: Option<Number>,
379    pub original_estimate: Option<Number>,
380    pub remaining_estimate: Option<Number>,
381    pub original_estimate_mapping: Option<String>,
382    pub remaining_estimate_mapping: Option<String>,
383    pub estimate_mapping: Option<String>,
384    pub spent_time: Option<Number>,
385    pub sprint: Option<String>,
386    pub releases: Option<Vec<String>>,
387}