use crate::error::HttpError;
use axum::http::StatusCode;
use docbox_core::{
database::models::folder::{FolderId, FolderWithExtra, ResolvedFolderWithExtra},
folders::create_folder::CreateFolderError,
};
use garde::Validate;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Validate, Deserialize, ToSchema)]
pub struct CreateFolderRequest {
#[garde(length(min = 1, max = 255))]
#[schema(min_length = 1, max_length = 255)]
pub name: String,
#[garde(skip)]
#[schema(value_type = Uuid)]
pub folder_id: FolderId,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct FolderResponse {
pub folder: FolderWithExtra,
pub children: ResolvedFolderWithExtra,
}
#[derive(Debug, Validate, Deserialize, ToSchema)]
pub struct UpdateFolderRequest {
#[garde(inner(length(min = 1, max = 255)))]
#[schema(min_length = 1, max_length = 255)]
pub name: Option<String>,
#[garde(skip)]
#[schema(value_type = Option<Uuid>)]
pub folder_id: Option<FolderId>,
#[garde(skip)]
#[schema(value_type = Option<bool>)]
pub pinned: Option<bool>,
}
#[derive(Debug, Validate, Deserialize, ToSchema)]
pub struct ZipFolderRequest {
#[garde(skip)]
#[serde(alias = "include_files")]
pub include: Option<Vec<Uuid>>,
#[garde(skip)]
#[serde(alias = "exclude_files")]
pub exclude: Option<Vec<Uuid>>,
}
#[derive(Debug, Error)]
pub enum HttpFolderError {
#[error("unknown folder")]
UnknownFolder,
#[error(transparent)]
CreateError(CreateFolderError),
#[error("unknown target folder")]
UnknownTargetFolder,
#[error("cannot delete root folder")]
CannotDeleteRoot,
#[error("cannot modify root folder")]
CannotModifyRoot,
#[error("cannot move a folder into itself")]
CannotMoveIntoSelf,
#[error("failed to create zip file")]
CreateZipFile,
}
impl HttpError for HttpFolderError {
fn status(&self) -> axum::http::StatusCode {
match self {
HttpFolderError::UnknownFolder | HttpFolderError::UnknownTargetFolder => {
StatusCode::NOT_FOUND
}
HttpFolderError::CannotModifyRoot
| HttpFolderError::CannotDeleteRoot
| HttpFolderError::CannotMoveIntoSelf => StatusCode::BAD_REQUEST,
HttpFolderError::CreateError(_) | HttpFolderError::CreateZipFile => {
StatusCode::INTERNAL_SERVER_ERROR
}
}
}
}