infrasynth-backend-kit/infrasynth/webhooks/registry.py
2026-08-28 14:38:47 -05:00

52 lines
1.6 KiB
Python

import logging
from dataclasses import dataclass, field
from django.db import transaction
logger = logging.getLogger(__name__)
@dataclass
class EventDefinition:
name: str
description: str = ""
example_payload: dict = field(default_factory=dict)
schema: dict = field(default_factory=dict)
class EventRegistry:
_events: dict[str, EventDefinition] = {}
@classmethod
def register(cls, event_name, *, description="", example_payload=None, schema=None):
cls._events[event_name] = EventDefinition(
name=event_name,
description=description,
example_payload=example_payload or {},
schema=schema or {},
)
logger.debug(f"Event registered: {event_name}")
@classmethod
def emit(cls, event_name, payload: dict):
from django.db.models import Q
from .models import OutboundSubscription
active_subs = OutboundSubscription.objects.filter(
Q(event_name=event_name) | Q(event_name="*"),
is_active=True,
endpoint__is_active=True,
).select_related("endpoint")
with transaction.atomic():
for sub in active_subs:
transaction.on_commit(
lambda sid=sub.id, en=event_name, pl=payload, pt=sub.payload_template: __import__( # type: ignore[misc]
"infrasynth.webhooks.dispatch", fromlist=["deliver_webhook"]
).deliver_webhook.delay(sid, en, pl, pt)
)
@classmethod
def get_registered_events(cls) -> dict[str, EventDefinition]:
return dict(cls._events)