ebb450be92
Singleton notification_policy table, NOTIFY_MIN_SEVERITY/CHANNELS env, central dispatch gate, Settings policy UI, migration 007. Co-authored-by: Cursor <cursoragent@cursor.com>
34 lines
1.5 KiB
Python
34 lines
1.5 KiB
Python
"""Dispatch ingest notifications per global policy (severity → channels)."""
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models import Event, Problem
|
|
from app.services import email_notify, telegram_notify, webhook_notify
|
|
from app.services.notification_policy import get_effective_notification_policy
|
|
from app.services.notification_severity import severity_meets_minimum
|
|
from app.services.notification_settings import CHANNEL_EMAIL, CHANNEL_TELEGRAM, CHANNEL_WEBHOOK
|
|
|
|
|
|
def notify_event(event: Event, *, db: Session | None = None) -> None:
|
|
policy = get_effective_notification_policy(db)
|
|
if not severity_meets_minimum(event.severity, policy.min_severity):
|
|
return
|
|
if policy.use_telegram:
|
|
telegram_notify.notify_event(event, db=db, apply_policy_gate=False)
|
|
if policy.use_webhook:
|
|
webhook_notify.notify_event(event, db=db, apply_policy_gate=False)
|
|
if policy.use_email:
|
|
email_notify.notify_event(event, db=db, apply_policy_gate=False)
|
|
|
|
|
|
def notify_problem(problem: Problem, event: Event | None = None, *, db: Session | None = None) -> None:
|
|
policy = get_effective_notification_policy(db)
|
|
if not severity_meets_minimum(problem.severity, policy.min_severity):
|
|
return
|
|
if policy.use_telegram:
|
|
telegram_notify.notify_problem(problem, event, db=db, apply_policy_gate=False)
|
|
if policy.use_webhook:
|
|
webhook_notify.notify_problem(problem, event, db=db, apply_policy_gate=False)
|
|
if policy.use_email:
|
|
email_notify.notify_problem(problem, event, db=db, apply_policy_gate=False)
|