Skip to main content

wekan_cli/client/boards/
presentation.rs

1use crate::client::{ClientError, WekanClient, transport::decode_success};
2use reqwest::header::ACCEPT;
3use secrecy::{ExposeSecret, SecretString};
4use serde::{Deserialize, Serialize};
5use std::collections::BTreeMap;
6
7#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
8#[serde(
9    deny_unknown_fields,
10    rename_all(deserialize = "camelCase", serialize = "snake_case")
11)]
12pub struct BoardViewVisibility {
13    pub show_on_public: bool,
14    pub show_on_private: bool,
15}
16/// Stored view overrides may contain either flag; GET's effective view has both.
17#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
18#[serde(
19    deny_unknown_fields,
20    rename_all(deserialize = "camelCase", serialize = "snake_case")
21)]
22pub struct StoredBoardViewVisibility {
23    pub show_on_public: Option<bool>,
24    pub show_on_private: Option<bool>,
25}
26#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
27#[serde(
28    deny_unknown_fields,
29    rename_all(deserialize = "camelCase", serialize = "snake_case")
30)]
31pub struct BoardViewSettings {
32    pub board_view_settings: BTreeMap<String, BoardViewVisibility>,
33    pub default_public_board_view: String,
34    pub default_private_board_view: String,
35    pub board_view_order: Vec<String>,
36    pub keys: Vec<String>,
37}
38#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
39#[serde(deny_unknown_fields, rename_all = "camelCase")]
40pub struct BoardViewVisibilityPatch {
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub show_on_public: Option<bool>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub show_on_private: Option<bool>,
45}
46#[derive(Clone, Debug, Default, Serialize)]
47#[serde(rename_all = "camelCase")]
48pub struct UpdateBoardViewSettingsRequest {
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub board_view_settings: Option<BTreeMap<String, BoardViewVisibilityPatch>>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub default_public_board_view: Option<String>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub default_private_board_view: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub board_view_order: Option<Vec<String>>,
57}
58#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
59#[serde(
60    deny_unknown_fields,
61    rename_all(deserialize = "camelCase", serialize = "snake_case")
62)]
63pub struct BoardCardFieldOrder {
64    pub card_field_order: Vec<String>,
65    pub keys: Vec<String>,
66}
67#[derive(Serialize)]
68#[serde(rename_all = "camelCase")]
69struct CardFieldOrderRequest<'a> {
70    card_field_order: &'a [String],
71}
72
73impl WekanClient {
74    pub async fn board_view_settings(
75        &self,
76        board: &str,
77        token: &SecretString,
78    ) -> Result<BoardViewSettings, ClientError> {
79        let body = self
80            .execute_success_request(
81                self.http
82                    .get(self.board_endpoint(board, Some("boardViewSettings"))?)
83                    .header(ACCEPT, "application/json")
84                    .bearer_auth(token.expose_secret()),
85            )
86            .await?;
87        decode_success(&body, "board view settings", true)
88    }
89    pub async fn update_board_view_settings(
90        &self,
91        board: &str,
92        request: &UpdateBoardViewSettingsRequest,
93        token: &SecretString,
94    ) -> Result<BoardViewSettings, ClientError> {
95        let body = self
96            .execute_success_request(
97                self.http
98                    .put(self.board_endpoint(board, Some("boardViewSettings"))?)
99                    .header(ACCEPT, "application/json")
100                    .bearer_auth(token.expose_secret())
101                    .json(request),
102            )
103            .await?;
104        decode_success(&body, "board view settings update", true)
105    }
106    pub async fn board_card_field_order(
107        &self,
108        board: &str,
109        token: &SecretString,
110    ) -> Result<BoardCardFieldOrder, ClientError> {
111        let body = self
112            .execute_success_request(
113                self.http
114                    .get(self.board_endpoint(board, Some("cardFieldOrder"))?)
115                    .header(ACCEPT, "application/json")
116                    .bearer_auth(token.expose_secret()),
117            )
118            .await?;
119        decode_success(&body, "board card field order", true)
120    }
121    pub async fn update_board_card_field_order(
122        &self,
123        board: &str,
124        fields: &[String],
125        token: &SecretString,
126    ) -> Result<BoardCardFieldOrder, ClientError> {
127        let body = self
128            .execute_success_request(
129                self.http
130                    .put(self.board_endpoint(board, Some("cardFieldOrder"))?)
131                    .header(ACCEPT, "application/json")
132                    .bearer_auth(token.expose_secret())
133                    .json(&CardFieldOrderRequest {
134                        card_field_order: fields,
135                    }),
136            )
137            .await?;
138        decode_success(&body, "board card field order update", true)
139    }
140}