Files
autoclip/backend/schemas/collection.py
T
2025-08-21 01:05:23 +08:00

79 lines
3.5 KiB
Python

"""
Collection-related Pydantic schemas.
"""
from datetime import datetime
from typing import Optional, List, Any
from enum import Enum
from pydantic import BaseModel, Field
from .base import BaseSchema, PaginationResponse
class CollectionStatus(str, Enum):
"""Collection status enumeration."""
CREATED = "created"
PROCESSING = "processing"
COMPLETED = "completed"
ERROR = "error"
DELETED = "deleted"
class CollectionCreate(BaseSchema):
"""Schema for creating a new collection."""
project_id: str = Field(..., description="Project ID")
name: str = Field(..., min_length=1, max_length=200, description="Collection name")
description: Optional[str] = Field(default=None, max_length=1000, description="Collection description")
theme: Optional[str] = Field(default=None, max_length=100, description="Collection theme")
tags: Optional[List[str]] = Field(default_factory=list, description="Collection tags")
metadata: Optional[dict] = Field(default_factory=dict, description="Additional metadata")
class CollectionUpdate(BaseSchema):
"""Schema for updating a collection."""
name: Optional[str] = Field(default=None, min_length=1, max_length=200, description="Collection name")
description: Optional[str] = Field(default=None, max_length=1000, description="Collection description")
theme: Optional[str] = Field(default=None, max_length=100, description="Collection theme")
status: Optional[CollectionStatus] = Field(default=None, description="Collection status")
tags: Optional[List[str]] = Field(default=None, description="Collection tags")
metadata: Optional[dict] = Field(default=None, description="Additional metadata")
class CollectionResponse(BaseSchema):
"""Schema for collection response."""
id: str = Field(description="Collection ID")
project_id: str = Field(description="Project ID")
name: str = Field(description="Collection name")
description: Optional[str] = Field(description="Collection description")
theme: Optional[str] = Field(description="Collection theme")
status: CollectionStatus = Field(description="Collection status")
tags: List[str] = Field(description="Collection tags")
metadata: dict = Field(description="Additional metadata")
created_at: datetime = Field(description="Creation timestamp")
updated_at: datetime = Field(description="Last update timestamp")
# Statistics
total_clips: int = Field(default=0, description="Total number of clips in collection")
# Clip IDs for frontend compatibility
clip_ids: List[str] = Field(default_factory=list, description="List of clip IDs in this collection")
class CollectionListResponse(BaseSchema):
"""Schema for collection list response."""
items: List[CollectionResponse] = Field(description="List of collections")
pagination: PaginationResponse = Field(description="Pagination information")
class CollectionWithClipsResponse(CollectionResponse):
"""Schema for collection response with clips."""
clips: List[Any] = Field(description="Clips in this collection")
class CollectionFilter(BaseSchema):
"""Schema for collection filtering."""
project_id: Optional[str] = Field(default=None, description="Filter by project ID")
status: Optional[CollectionStatus] = Field(default=None, description="Filter by status")
theme: Optional[str] = Field(default=None, description="Filter by theme")
tags: Optional[List[str]] = Field(default=None, description="Filter by tags")
search: Optional[str] = Field(default=None, description="Search in name and description")