"""Notification SQLAlchemy model.""" from datetime import datetime from typing import Any import uuid from sqlalchemy import DateTime, ForeignKey, JSON, String, Text from sqlalchemy import Uuid as UUID from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql import func from src.models.base import Base, UUIDPrimaryKeyMixin class Notification(UUIDPrimaryKeyMixin, Base): __tablename__ = "notifications" user_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True, ) category: Mapped[str] = mapped_column(String(32), nullable=False) severity: Mapped[str] = mapped_column(String(16), nullable=False) title: Mapped[str] = mapped_column(String(255), nullable=False) message: Mapped[str | None] = mapped_column(Text, nullable=True) source_type: Mapped[str | None] = mapped_column(String(64), nullable=True) source_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True ) notification_metadata: Mapped[dict[str, Any]] = mapped_column( "metadata", JSON, nullable=False, default=dict ) read_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, index=True ) dismissed_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False, index=True )