class AppError(Exception): code = "internal_error" message = "An unexpected error occurred." def __init__(self, message: str | None = None) -> None: super().__init__(message or self.message) self.detail = message or self.message class NotFoundError(AppError): code = "not_found" message = "Resource not found." class ConflictError(AppError): code = "conflict" message = "Resource conflict." class ValidationError(AppError): code = "validation_error" message = "Validation failed." class UnauthorizedError(AppError): code = "unauthorized" message = "Authentication is required." class AuthenticationFailedError(UnauthorizedError): code = "authentication_failed" message = "Invalid username or password." class AuthSessionExpiredError(UnauthorizedError): code = "auth_session_expired" message = "Authentication session is no longer valid." class DirectoryNotFoundError(NotFoundError): code = "directory_not_found" message = "Directory does not exist." class DirectoryConflictError(ConflictError): code = "directory_conflict" message = "Directory already exists." class FileNotFoundError(NotFoundError): code = "file_not_found" message = "File does not exist." class FileConflictError(ConflictError): code = "file_conflict" message = "File already exists." class UploadNotFoundError(NotFoundError): code = "upload_not_found" message = "Upload session does not exist." class UploadConflictError(ConflictError): code = "upload_conflict" message = "Upload state conflict." class RangeNotSatisfiableError(AppError): code = "range_not_satisfiable" message = "Requested byte range is not satisfiable." class PreviewNotSupportedError(AppError): code = "preview_not_supported" message = "Preview is not supported for this file type."