from pydantic import BaseModel, field_validator from typing import List, Optional from datetime import datetime class AuthorBase(BaseModel): name: str biography: Optional[str] = None birthdate: Optional[datetime] = None class AuthorCreate(AuthorBase): pass class AuthorUpdate(BaseModel): name: Optional[str] = None biography: Optional[str] = None birthdate: Optional[datetime] = None class Author(AuthorBase): id: int created_at: datetime updated_at: datetime class Config: from_attributes = True class CategoryBase(BaseModel): name: str description: Optional[str] = None class CategoryCreate(CategoryBase): pass class CategoryUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None class Category(CategoryBase): id: int created_at: datetime updated_at: datetime class Config: from_attributes = True class BookBase(BaseModel): title: str isbn: str description: Optional[str] = None price: float cover_image_url: Optional[str] = None publication_date: Optional[datetime] = None publisher: Optional[str] = None language: Optional[str] = None page_count: Optional[int] = None stock_quantity: int = 0 @field_validator("price") def price_must_be_positive(cls, v): if v <= 0: raise ValueError("Price must be greater than zero") return v @field_validator("stock_quantity") def stock_quantity_must_be_non_negative(cls, v): if v < 0: raise ValueError("Stock quantity must be non-negative") return v class BookCreate(BookBase): author_ids: List[int] category_ids: List[int] class BookUpdate(BaseModel): title: Optional[str] = None isbn: Optional[str] = None description: Optional[str] = None price: Optional[float] = None cover_image_url: Optional[str] = None publication_date: Optional[datetime] = None publisher: Optional[str] = None language: Optional[str] = None page_count: Optional[int] = None stock_quantity: Optional[int] = None author_ids: Optional[List[int]] = None category_ids: Optional[List[int]] = None @field_validator("price") def price_must_be_positive(cls, v): if v is not None and v <= 0: raise ValueError("Price must be greater than zero") return v @field_validator("stock_quantity") def stock_quantity_must_be_non_negative(cls, v): if v is not None and v < 0: raise ValueError("Stock quantity must be non-negative") return v class Book(BookBase): id: int authors: List[Author] categories: List[Category] created_at: datetime updated_at: datetime class Config: from_attributes = True class BookList(BaseModel): total: int items: List[Book]