from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.application.events import EventDispatchService from app.core.database import get_db from app.core.security import ApiPrincipal, require_api_key from app.modules.events.constants import EventResponseKey from app.modules.events.schemas import DomainEventListRead, DomainEventRead from app.modules.events.services import EventService, _serialize_event router = APIRouter(dependencies=[Depends(require_api_key)]) @router.get("", response_model=DomainEventListRead) def list_events( status: str | None = None, event_type: str | None = None, limit: int = Query(default=100, ge=1, le=500), db: Session = Depends(get_db), ) -> dict: return { EventResponseKey.ITEMS: EventService(db).list_events( status_filter=status, event_type=event_type, limit=limit, ) } @router.post("/{event_id}/dispatch", response_model=dict[str, DomainEventRead]) def dispatch_event( event_id: str, db: Session = Depends(get_db), ) -> dict: return { EventResponseKey.EVENT: _serialize_event( EventDispatchService(db).dispatch_event(event_id) ) } @router.post("/{event_id}/retry", response_model=dict[str, DomainEventRead]) def retry_event( event_id: str, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return { EventResponseKey.EVENT: _serialize_event( EventDispatchService(db).retry_event(event_id, actor=principal.actor) ) } @router.post("/dispatch-pending", response_model=DomainEventListRead) def dispatch_pending( limit: int = Query(default=100, ge=1, le=500), db: Session = Depends(get_db), ) -> dict: return { EventResponseKey.ITEMS: EventDispatchService(db).dispatch_pending(limit=limit) }