""" Pydantic schemas for Item and StorageBin resources. Design choices --------------- - All price fields are optional: items can be added quickly without price info. - ``status`` uses the ItemStatus enum so the API documents the allowed values. - The ``*Read`` schemas include nested owner / bin info so clients don't need to make extra requests. """ from datetime import datetime from pydantic import BaseModel, ConfigDict, HttpUrl from app.models.item import ItemStatus # --------------------------------------------------------------------------- # StorageBin schemas # --------------------------------------------------------------------------- class StorageBinCreate(BaseModel): """Request body for POST /bins.""" name: str description: str | None = None class StorageBinRead(BaseModel): """Response schema for a storage bin.""" model_config = ConfigDict(from_attributes=True) id: int name: str description: str | None owner_id: int created_at: datetime class StorageBinUpdate(BaseModel): """Request body for PATCH /bins/{id}.""" name: str | None = None description: str | None = None # --------------------------------------------------------------------------- # Item schemas # --------------------------------------------------------------------------- class ItemCreate(BaseModel): """ Request body for POST /items. Only ``title`` is required so that items can be added quickly during a "chaos-dump" session. Everything else can be filled in later. """ title: str description: str | None = None status: ItemStatus = ItemStatus.FOUND purchase_price: float | None = None listing_price: float | None = None sale_price: float | None = None listing_url: str | None = None sku: str | None = None storage_bin_id: int | None = None class ItemRead(BaseModel): """Full response schema for an item.""" model_config = ConfigDict(from_attributes=True) id: int title: str description: str | None status: ItemStatus purchase_price: float | None listing_price: float | None sale_price: float | None listing_url: str | None sku: str | None storage_bin_id: int | None created_by_id: int | None updated_by_id: int | None created_at: datetime updated_at: datetime class ItemUpdate(BaseModel): """ Request body for PATCH /items/{id}. All fields optional so callers can update just one field at a time (e.g., only the status when marking something sold). """ title: str | None = None description: str | None = None status: ItemStatus | None = None purchase_price: float | None = None listing_price: float | None = None sale_price: float | None = None listing_url: str | None = None sku: str | None = None storage_bin_id: int | None = None class ItemListResponse(BaseModel): """Paginated list response for GET /items.""" total: int page: int page_size: int items: list[ItemRead]