bifroest/app/notify/models.py
2026-10-27 08:34:17 +01:00

30 lines
1.4 KiB
Python

"""Ausgehende Benachrichtigungen (Outbox): in der Transaktion des Ereignisses angelegt, vom Worker zugestellt."""
from datetime import datetime
from sqlalchemy import ForeignKey, Integer, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base, now
EMAIL, WEBHOOK = "email", "webhook"
PENDING, SENT, FAILED, SKIPPED = "pending", "sent", "failed", "skipped"
class Notification(Base):
__tablename__ = "notifications"
id: Mapped[int] = mapped_column(primary_key=True)
channel: Mapped[str] = mapped_column(String(20)) # email | webhook
# E-Mail: Nutzer; Webhook: Workspace (die Adresse wird erst beim Zustellen gelesen)
user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"))
workspace_id: Mapped[int | None] = mapped_column(ForeignKey("workspaces.id", ondelete="CASCADE"), index=True)
event: Mapped[str] = mapped_column(String(50))
subject: Mapped[str] = mapped_column(String(300))
body: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(20), default=PENDING, index=True)
attempts: Mapped[int] = mapped_column(Integer, default=0)
error: Mapped[str] = mapped_column(String(500), default="")
available_at: Mapped[datetime] = mapped_column(default=func.now()) # Uhr der Datenbank
created: Mapped[datetime] = mapped_column(default=now)
sent: Mapped[datetime | None]