import uuid from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.database import get_db from app.models.prompt_template import PromptTemplate from app.models.user import User from app.schemas.prompt_template import TemplateCreate, TemplateResponse, TemplateUpdate router = APIRouter(prefix="/api/templates", tags=["templates"]) @router.get("", response_model=list[TemplateResponse]) async def list_templates( db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): result = await db.execute( select(PromptTemplate).order_by(PromptTemplate.created_at) ) return list(result.scalars().all()) @router.post("", response_model=TemplateResponse, status_code=201) async def create_template( data: TemplateCreate, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): template = PromptTemplate(**data.model_dump()) db.add(template) await db.commit() await db.refresh(template) return template @router.get("/{template_id}", response_model=TemplateResponse) async def get_template( template_id: uuid.UUID, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): result = await db.execute( select(PromptTemplate).where(PromptTemplate.id == template_id) ) template = result.scalar_one_or_none() if not template: raise HTTPException(404, "Template not found") return template @router.put("/{template_id}", response_model=TemplateResponse) async def update_template( template_id: uuid.UUID, data: TemplateUpdate, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): result = await db.execute( select(PromptTemplate).where(PromptTemplate.id == template_id) ) template = result.scalar_one_or_none() if not template: raise HTTPException(404, "Template not found") for field, value in data.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=204) async def delete_template( template_id: uuid.UUID, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): result = await db.execute( select(PromptTemplate).where(PromptTemplate.id == template_id) ) template = result.scalar_one_or_none() if not template: raise HTTPException(404, "Template not found") await db.delete(template) await db.commit()