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)