LetsBeBiz-Redesign/letsbe-orchestrator/app/routes/events.py

78 lines
2.2 KiB
Python

"""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