Skip to main content

wekan_cli/client/boards/
attachments.rs

1use reqwest::header::ACCEPT;
2use secrecy::{ExposeSecret, SecretString};
3use serde::{Deserialize, Serialize};
4
5use crate::client::{ClientError, WekanClient, transport::decode_success};
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 BoardAttachment {
13    pub attachment_id: String,
14    pub attachment_name: String,
15    pub attachment_type: String,
16    #[serde(default, deserialize_with = "present")]
17    pub url: Option<String>,
18    #[serde(default, deserialize_with = "present")]
19    pub url_download: Option<String>,
20    pub board_id: String,
21    #[serde(default, deserialize_with = "present")]
22    pub swimlane_id: Option<String>,
23    #[serde(default, deserialize_with = "present")]
24    pub list_id: Option<String>,
25    #[serde(default, deserialize_with = "present")]
26    pub card_id: Option<String>,
27}
28
29fn present<'de, D: serde::Deserializer<'de>>(d: D) -> Result<Option<String>, D::Error> {
30    String::deserialize(d).map(Some)
31}
32
33impl WekanClient {
34    pub async fn board_attachments(
35        &self,
36        board: &str,
37        token: &SecretString,
38    ) -> Result<Vec<BoardAttachment>, ClientError> {
39        super::members::validate_id(board)?;
40        let body = self
41            .execute_success_request(
42                self.http
43                    .get(self.board_endpoint(board, Some("attachments"))?)
44                    .header(ACCEPT, "application/json")
45                    .bearer_auth(token.expose_secret()),
46            )
47            .await?;
48        decode_success(&body, "board attachment list", true)
49    }
50}