""" Webhook event handler registry. Handlers are registered via the @register_handler decorator. The view imports handlers from this module, and consumers register themselves. This avoids circular imports between views and consumers. """ import logging from collections.abc import Callable logger = logging.getLogger(__name__) # Event type → handler function mapping _HANDLERS: dict[str, Callable] = {} def register_handler(event_type: str): """Decorator to register a handler for a webhook event type.""" def decorator(func): _HANDLERS[event_type] = func logger.debug(f"Registered webhook handler for {event_type}: {func.__name__}") return func return decorator def get_handler(event_type: str) -> Callable | None: """Look up the handler for a given event type.""" return _HANDLERS.get(event_type) def get_registered_events() -> set: """Return set of all registered event types.""" return set(_HANDLERS.keys()) # Import consumers to trigger @register_handler decorators at module load time # This is safe because consumers only imports from handlers, not from views. import access_core.intake.consumers # noqa: F401