PawTrace / backend /app /models /notification.py
Elliott Duke
HomingPet: lost-dog reunification (FastAPI + React) with Render deploy
de1e3fc
Raw
History Blame Contribute Delete
1.45 kB
from __future__ import annotations
from datetime import datetime, timezone
from sqlalchemy import (
DateTime,
Enum as SAEnum,
ForeignKey,
String,
Text,
func,
)
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base, NotificationChannel, NotificationStatus
class Notification(Base):
"""A record of one notification send attempt (spec §7.8, §10)."""
__tablename__ = "notifications"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"), nullable=True)
case_id: Mapped[int | None] = mapped_column(ForeignKey("cases.id"), nullable=True)
match_id: Mapped[int | None] = mapped_column(ForeignKey("matches.id"), nullable=True)
channel: Mapped[NotificationChannel] = mapped_column(
SAEnum(NotificationChannel, native_enum=False)
)
status: Mapped[NotificationStatus] = mapped_column(
SAEnum(NotificationStatus, native_enum=False), default=NotificationStatus.queued
)
to_address: Mapped[str | None] = mapped_column(String(255), nullable=True)
payload: Mapped[str] = mapped_column(Text, default="")
sent_at: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True), nullable=True
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
server_default=func.now(),
)