from fastapi import APIRouter, Depends, HTTPException, Path, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.database import get_db from app.routers.auth import get_current_user from app.models.user import User from app.models.event_template import EventTemplate from app.schemas.event_template import ( EventTemplateCreate, EventTemplateUpdate, EventTemplateResponse, ) router = APIRouter() @router.get("/", response_model=list[EventTemplateResponse]) async def list_templates( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): result = await db.execute( select(EventTemplate) .where(EventTemplate.user_id == current_user.id) .order_by(EventTemplate.name) ) return result.scalars().all() @router.post("/", response_model=EventTemplateResponse, status_code=status.HTTP_201_CREATED) async def create_template( payload: EventTemplateCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): template = EventTemplate(**payload.model_dump(), user_id=current_user.id) db.add(template) await db.commit() await db.refresh(template) return template @router.put("/{template_id}", response_model=EventTemplateResponse) async def update_template( template_id: int = Path(ge=1, le=2147483647), payload: EventTemplateUpdate = ..., db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): result = await db.execute( select(EventTemplate).where( EventTemplate.id == template_id, EventTemplate.user_id == current_user.id, ) ) template = result.scalar_one_or_none() if template is None: raise HTTPException(status_code=404, detail="Template not found") for field, value in payload.model_dump(exclude_unset=True).items(): setattr(template, field, value) await db.commit() await db.refresh(template) return template @router.delete("/{template_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_template( template_id: int = Path(ge=1, le=2147483647), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): result = await db.execute( select(EventTemplate).where( EventTemplate.id == template_id, EventTemplate.user_id == current_user.id, ) ) template = result.scalar_one_or_none() if template is None: raise HTTPException(status_code=404, detail="Template not found") await db.delete(template) await db.commit()