78 lines
2.2 KiB
Python
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
|