from datetime import datetime from typing import Optional, List, Generic, TypeVar from pydantic import BaseModel from uuid import UUID T = TypeVar("T") # Pagination schemas class PaginationMeta(BaseModel): page: int limit: int total: int total_pages: int class PaginatedResponse(BaseModel, Generic[T]): items: List[T] pagination: PaginationMeta # Project schemas class ProjectCreate(BaseModel): name: str description: Optional[str] = None is_public: bool = True class ProjectResponse(BaseModel): id: UUID name: str description: Optional[str] is_public: bool created_at: datetime updated_at: datetime created_by: str class Config: from_attributes = True # Package schemas class PackageCreate(BaseModel): name: str description: Optional[str] = None class PackageResponse(BaseModel): id: UUID project_id: UUID name: str description: Optional[str] created_at: datetime updated_at: datetime class Config: from_attributes = True # Artifact schemas class ArtifactResponse(BaseModel): id: str size: int content_type: Optional[str] original_name: Optional[str] created_at: datetime created_by: str ref_count: int class Config: from_attributes = True # Tag schemas class TagCreate(BaseModel): name: str artifact_id: str class TagResponse(BaseModel): id: UUID package_id: UUID name: str artifact_id: str created_at: datetime created_by: str class Config: from_attributes = True # Upload response class UploadResponse(BaseModel): artifact_id: str size: int project: str package: str tag: Optional[str] # Consumer schemas class ConsumerResponse(BaseModel): id: UUID package_id: UUID project_url: str last_access: datetime created_at: datetime class Config: from_attributes = True # Health check class HealthResponse(BaseModel): status: str version: str = "1.0.0"