Skip to main content

docbox_http/models/
folder.rs

1use crate::error::HttpError;
2use axum::http::StatusCode;
3use docbox_core::{
4    database::models::folder::{FolderId, FolderWithExtra, ResolvedFolderWithExtra},
5    folders::create_folder::CreateFolderError,
6};
7use garde::Validate;
8use serde::{Deserialize, Serialize};
9use thiserror::Error;
10use utoipa::ToSchema;
11
12/// Request to create a folder
13#[derive(Debug, Validate, Deserialize, ToSchema)]
14pub struct CreateFolderRequest {
15    /// Name for the folder
16    #[garde(length(min = 1, max = 255))]
17    #[schema(min_length = 1, max_length = 255)]
18    pub name: String,
19
20    /// ID of the folder to store folder in
21    #[garde(skip)]
22    #[schema(value_type = Uuid)]
23    pub folder_id: FolderId,
24}
25
26/// Response for requesting a document box
27#[derive(Debug, Serialize, ToSchema)]
28pub struct FolderResponse {
29    /// The folder itself
30    pub folder: FolderWithExtra,
31
32    /// Resolved contents of the folder
33    pub children: ResolvedFolderWithExtra,
34}
35
36/// Request to rename and or move a folder
37#[derive(Debug, Validate, Deserialize, ToSchema)]
38pub struct UpdateFolderRequest {
39    /// Name for the folder
40    #[garde(inner(length(min = 1, max = 255)))]
41    #[schema(min_length = 1, max_length = 255)]
42    pub name: Option<String>,
43
44    /// ID of the new parent folder for the folder
45    #[garde(skip)]
46    #[schema(value_type = Option<Uuid>)]
47    pub folder_id: Option<FolderId>,
48
49    /// Whether to pin the folder
50    #[garde(skip)]
51    #[schema(value_type = Option<bool>)]
52    pub pinned: Option<bool>,
53}
54
55#[derive(Debug, Error)]
56pub enum HttpFolderError {
57    #[error("unknown folder")]
58    UnknownFolder,
59
60    /// Failed to create the folder
61    #[error(transparent)]
62    CreateError(CreateFolderError),
63
64    #[error("unknown target folder")]
65    UnknownTargetFolder,
66
67    #[error("cannot delete root folder")]
68    CannotDeleteRoot,
69
70    #[error("cannot modify root folder")]
71    CannotModifyRoot,
72
73    #[error("cannot move a folder into itself")]
74    CannotMoveIntoSelf,
75}
76
77impl HttpError for HttpFolderError {
78    fn status(&self) -> axum::http::StatusCode {
79        match self {
80            HttpFolderError::UnknownFolder | HttpFolderError::UnknownTargetFolder => {
81                StatusCode::NOT_FOUND
82            }
83            HttpFolderError::CannotModifyRoot
84            | HttpFolderError::CannotDeleteRoot
85            | HttpFolderError::CannotMoveIntoSelf => StatusCode::BAD_REQUEST,
86            HttpFolderError::CreateError(_) => StatusCode::INTERNAL_SERVER_ERROR,
87        }
88    }
89}