"""Base model and mixins for SQLAlchemy ORM.""" import uuid from datetime import datetime, timezone from sqlalchemy import DateTime from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column def utc_now() -> datetime: """Return current UTC datetime.""" return datetime.now(timezone.utc) class Base(AsyncAttrs, DeclarativeBase): """Base class for all SQLAlchemy models.""" pass class UUIDMixin: """Mixin that adds a UUID primary key.""" id: Mapped[uuid.UUID] = mapped_column( primary_key=True, default=uuid.uuid4, ) class TimestampMixin: """Mixin that adds created_at and updated_at timestamps.""" created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utc_now, nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utc_now, onupdate=utc_now, nullable=False, )