30 lines
1.4 KiB
Python
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]
|