docbox_http/models/
folder.rs1use 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#[derive(Debug, Validate, Deserialize, ToSchema)]
14pub struct CreateFolderRequest {
15 #[garde(length(min = 1, max = 255))]
17 #[schema(min_length = 1, max_length = 255)]
18 pub name: String,
19
20 #[garde(skip)]
22 #[schema(value_type = Uuid)]
23 pub folder_id: FolderId,
24}
25
26#[derive(Debug, Serialize, ToSchema)]
28pub struct FolderResponse {
29 pub folder: FolderWithExtra,
31
32 pub children: ResolvedFolderWithExtra,
34}
35
36#[derive(Debug, Validate, Deserialize, ToSchema)]
38pub struct UpdateFolderRequest {
39 #[garde(inner(length(min = 1, max = 255)))]
41 #[schema(min_length = 1, max_length = 255)]
42 pub name: Option<String>,
43
44 #[garde(skip)]
46 #[schema(value_type = Option<Uuid>)]
47 pub folder_id: Option<FolderId>,
48
49 #[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 #[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}