"""SQLAlchemy declarative base and common mixins.""" from datetime import UTC, datetime from typing import Annotated from uuid import UUID, uuid4 from sqlalchemy import DateTime, func from sqlalchemy.dialects.postgresql import UUID as PostgreSQLUUID from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column UUIDPrimaryKey = Annotated[ UUID, mapped_column(PostgreSQLUUID(as_uuid=True), primary_key=True, default=uuid4), ] class Base(DeclarativeBase): pass class UUIDMixin: id: Mapped[UUIDPrimaryKey] class TimestampMixin: created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(UTC), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), server_default=func.now(), nullable=False, )