from __future__ import annotations from datetime import datetime, timezone from decimal import Decimal from sqlalchemy import Boolean, CheckConstraint, DateTime, Numeric, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base class Product(Base): __tablename__ = "products" __table_args__ = ( CheckConstraint("price > 0", name="ck_products_price_positive"), CheckConstraint("stock >= 0", name="ck_products_stock_non_negative"), ) id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(120), nullable=False, index=True) description: Mapped[str | None] = mapped_column(Text, nullable=True) price: Mapped[Decimal] = mapped_column(Numeric(10, 2), nullable=False) stock: Mapped[int] = mapped_column(nullable=False, default=0) is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False, )