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#[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}