"""Event management endpoints.""" import uuid from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy import select from app.db import AsyncSessionDep from app.dependencies.admin_auth import verify_admin_api_key from app.models.event import Event from app.schemas.event import EventCreate, EventResponse router = APIRouter(prefix="/events", tags=["Events"]) @router.get("", response_model=list[EventResponse]) async def list_events( db: AsyncSessionDep, event_type: str | None = Query(None, description="Filter by event type"), tenant_id: uuid.UUID | None = Query(None, description="Filter by tenant ID"), limit: int = Query(50, ge=1, le=200, description="Maximum number of events to return"), offset: int = Query(0, ge=0, description="Number of events to skip"), ) -> list[Event]: """List events with optional filtering and pagination.""" query = select(Event).order_by(Event.created_at.desc()) if event_type is not None: query = query.where(Event.event_type == event_type) if tenant_id is not None: query = query.where(Event.tenant_id == tenant_id) query = query.offset(offset).limit(limit) result = await db.execute(query) return list(result.scalars().all()) @router.get("/{event_id}", response_model=EventResponse) async def get_event( event_id: uuid.UUID, db: AsyncSessionDep, ) -> Event: """Get an event by ID.""" result = await db.execute(select(Event).where(Event.id == event_id)) event = result.scalar_one_or_none() if event is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Event {event_id} not found", ) return event @router.post( "", response_model=EventResponse, status_code=status.HTTP_201_CREATED, dependencies=[Depends(verify_admin_api_key)], ) async def create_event( event_in: EventCreate, db: AsyncSessionDep, ) -> Event: """Create a new event (admin auth required).""" event = Event( tenant_id=event_in.tenant_id, task_id=event_in.task_id, event_type=event_in.event_type, payload=event_in.payload, ) db.add(event) await db.commit() await db.refresh(event) return event