Implement webhook

This commit is contained in:
Xin Wang
2026-08-07 14:08:49 +08:00
parent 39ee5ef96e
commit b2e99baa19
14 changed files with 886 additions and 34 deletions

View File

@@ -374,3 +374,51 @@ class ConversationArtifact(Base):
DateTime(timezone=True), server_default=func.now()
)
extra: Mapped[dict] = mapped_column(JSONB, default=dict)
class SiteSetting(Base):
"""Deployment-wide settings, split into public values and write-only secrets."""
__tablename__ = "site_settings"
key: Mapped[str] = mapped_column(String(64), primary_key=True)
value: Mapped[dict] = mapped_column(JSONB, default=dict)
secrets: Mapped[dict] = mapped_column(JSONB, default=dict)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
class WebhookDelivery(Base):
"""Immutable event snapshot plus its asynchronous delivery state."""
__tablename__ = "webhook_deliveries"
id: Mapped[str] = mapped_column(String(40), primary_key=True)
event_id: Mapped[str] = mapped_column(String(40), unique=True)
event_type: Mapped[str] = mapped_column(String(128), index=True)
conversation_id: Mapped[str | None] = mapped_column(
String(40),
ForeignKey("conversation_sessions.id", ondelete="SET NULL"),
nullable=True,
index=True,
)
payload: Mapped[dict] = mapped_column(JSONB)
url: Mapped[str] = mapped_column(String(2048))
secrets: Mapped[dict] = mapped_column(JSONB, default=dict)
status: Mapped[str] = mapped_column(String(16), index=True, default="pending")
attempt_count: Mapped[int] = mapped_column(Integer, default=0)
next_attempt_at: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True), nullable=True, index=True
)
last_status_code: Mapped[int | None] = mapped_column(Integer, nullable=True)
last_error: Mapped[str] = mapped_column(String(2048), default="")
delivered_at: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True), nullable=True
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now()
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)