"""Library resource API schemas.""" from datetime import datetime from pydantic import BaseModel, Field from app.domain.enums import LibraryFileRole, LibraryResourceStatus, LibraryResourceType class PresignUploadRequest(BaseModel): """Request payload for generating direct-upload metadata.""" resource_type: LibraryResourceType file_role: LibraryFileRole file_name: str content_type: str class PresignUploadResponse(BaseModel): """Response returned when generating direct-upload metadata.""" method: str upload_url: str headers: dict[str, str] = Field(default_factory=dict) storage_key: str public_url: str class CreateLibraryResourceFileRequest(BaseModel): """Metadata for one already-uploaded file.""" file_role: LibraryFileRole storage_key: str public_url: str mime_type: str size_bytes: int sort_order: int = 0 width: int | None = None height: int | None = None class CreateLibraryResourceRequest(BaseModel): """One-shot resource creation request.""" resource_type: LibraryResourceType name: str description: str | None = None tags: list[str] = Field(default_factory=list) gender: str | None = None age_group: str | None = None pose_id: int | None = None environment: str | None = None category: str | None = None files: list[CreateLibraryResourceFileRequest] class UpdateLibraryResourceRequest(BaseModel): """Partial update request for a library resource.""" name: str | None = None description: str | None = None tags: list[str] | None = None gender: str | None = None age_group: str | None = None pose_id: int | None = None environment: str | None = None category: str | None = None cover_file_id: int | None = None class ArchiveLibraryResourceResponse(BaseModel): """Response returned after archiving a resource.""" id: int class LibraryResourceFileRead(BaseModel): """Serialized library file metadata.""" id: int file_role: LibraryFileRole storage_key: str public_url: str bucket: str mime_type: str size_bytes: int sort_order: int width: int | None = None height: int | None = None created_at: datetime class LibraryResourceRead(BaseModel): """Serialized library resource.""" id: int resource_type: LibraryResourceType name: str description: str | None = None tags: list[str] status: LibraryResourceStatus gender: str | None = None age_group: str | None = None pose_id: int | None = None environment: str | None = None category: str | None = None cover_url: str | None = None original_url: str | None = None files: list[LibraryResourceFileRead] created_at: datetime updated_at: datetime class LibraryResourceListResponse(BaseModel): """Paginated library resource response.""" total: int items: list[LibraryResourceRead]