Source code for cloud_server.models
"""Pydantic models for the server."""
from datetime import datetime
from enum import StrEnum
from pathlib import Path
from pydantic import BaseModel, ConfigDict, Field
from python_template_server.models import BaseResponse, DatabaseConfig, TemplateServerConfig
# Cloud Server Configuration Models
[docs]
class ServerDatabaseConfig(DatabaseConfig):
"""Configuration for the server database."""
files_metadata_db_filename: str = Field(
default="files_metadata.db", description="The filename for the files metadata database."
)
[docs]
class StorageConfig(BaseModel):
"""Configuration model for the cloud storage."""
upload_chunk_size_kb: int = Field(default=8, description="Chunk size for file uploads in KB.")
max_file_size_mb: int = Field(default=100, description="Maximum file size in MB.")
thumbnail_size: tuple[int, int] = Field(default=(200, 200), description="Thumbnail size (width, height).")
[docs]
class CloudServerConfig(TemplateServerConfig):
"""Cloud server configuration."""
db: ServerDatabaseConfig = Field(default_factory=ServerDatabaseConfig, description="Database configuration.")
storage_config: StorageConfig = Field(default_factory=StorageConfig, description="Storage configuration.")
# Database
[docs]
def current_timestamp_int() -> int:
"""Get the current Unix timestamp as an integer.
:return int: The current Unix timestamp
"""
return int(datetime.fromisoformat(BaseResponse.current_timestamp().rstrip("Z")).timestamp())
[docs]
class DatabaseAction(StrEnum):
"""Enumeration for database actions."""
CREATE = "create"
READ = "read"
UPDATE = "update"
DELETE = "delete"
# File Models
# API Response Models
[docs]
class ListFilesResponse(BaseResponse):
"""Response model for getting metadata for all files."""
model_config = ConfigDict(populate_by_name=True)
files_metadata: list[FileMetadata] = Field(..., description="The metadata of all files.", alias="filesMetadata")
[docs]
class UploadFileResponse(BaseResponse):
"""Response model for uploading a file."""
model_config = ConfigDict(populate_by_name=True)
file_metadata: FileMetadata = Field(..., description="The metadata of the uploaded file.", alias="fileMetadata")
[docs]
class DeleteFileResponse(BaseResponse):
"""Response model for deleting a file."""
model_config = ConfigDict(populate_by_name=True)
file_metadata: FileMetadata = Field(..., description="The metadata of the deleted file.", alias="fileMetadata")
# API Request Models