from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.auth import get_current_admin_user from app.database import get_session from app.models import Event from app.schemas import EventCreate, EventUpdate, EventResponse from app.user_models import User router = APIRouter() @router.get("", response_model=list[EventResponse]) async def list_events( active: Optional[bool] = Query(None, description="Filter by active status"), session: AsyncSession = Depends(get_session), ): query = select(Event).order_by(Event.date) if active is not None: query = query.where(Event.active == active) result = await session.execute(query) return list(result.scalars().all()) @router.get("/{event_id}", response_model=EventResponse) async def get_event(event_id: int, session: AsyncSession = Depends(get_session)): result = await session.execute(select(Event).where(Event.id == event_id)) event = result.scalar_one_or_none() if not event: return {"error": "Event not found"} return event @router.post("", response_model=EventResponse, status_code=201) async def create_event( payload: EventCreate, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): event = Event(**payload.model_dump(), active=True) session.add(event) await session.commit() await session.refresh(event) return event @router.put("/{event_id}", response_model=EventResponse) async def update_event( event_id: int, payload: EventUpdate, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): result = await session.execute(select(Event).where(Event.id == event_id)) event = result.scalar_one_or_none() if not event: return {"error": "Event not found"} for key, value in payload.model_dump(exclude_unset=True).items(): setattr(event, key, value) await session.commit() await session.refresh(event) return event @router.delete("/{event_id}", status_code=204) async def delete_event( event_id: int, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): result = await session.execute(select(Event).where(Event.id == event_id)) event = result.scalar_one_or_none() if not event: return {"error": "Event not found"} await session.delete(event) await session.commit()