"""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]