import uuid from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import GlobalRenderPosition from app.domains.rendering.schemas import ( GlobalRenderPositionCreate, GlobalRenderPositionPatch, GlobalRenderPositionOut, ) from app.utils.auth import require_global_admin, get_current_user router = APIRouter(prefix="/render-positions/global", tags=["global-render-positions"]) @router.get("", response_model=list[GlobalRenderPositionOut]) async def list_global_render_positions( db: AsyncSession = Depends(get_db), _user=Depends(get_current_user), ): """List all global render positions (available to all authenticated users).""" result = await db.execute( select(GlobalRenderPosition).order_by(GlobalRenderPosition.sort_order, GlobalRenderPosition.name) ) return result.scalars().all() @router.post("", response_model=GlobalRenderPositionOut, status_code=status.HTTP_201_CREATED) async def create_global_render_position( body: GlobalRenderPositionCreate, db: AsyncSession = Depends(get_db), _user=Depends(require_global_admin), ): """Create a new global render position (admin only).""" pos = GlobalRenderPosition(**body.model_dump()) db.add(pos) await db.commit() await db.refresh(pos) return pos @router.patch("/{pos_id}", response_model=GlobalRenderPositionOut) async def update_global_render_position( pos_id: uuid.UUID, body: GlobalRenderPositionPatch, db: AsyncSession = Depends(get_db), _user=Depends(require_global_admin), ): """Update a global render position (admin only).""" result = await db.execute(select(GlobalRenderPosition).where(GlobalRenderPosition.id == pos_id)) pos = result.scalar_one_or_none() if not pos: raise HTTPException(status_code=404, detail="Global render position not found") for field, value in body.model_dump(exclude_unset=True).items(): setattr(pos, field, value) await db.commit() await db.refresh(pos) return pos @router.delete("/{pos_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_global_render_position( pos_id: uuid.UUID, db: AsyncSession = Depends(get_db), _user=Depends(require_global_admin), ): """Delete a global render position (admin only).""" result = await db.execute(select(GlobalRenderPosition).where(GlobalRenderPosition.id == pos_id)) pos = result.scalar_one_or_none() if not pos: raise HTTPException(status_code=404, detail="Global render position not found") await db.delete(pos) await db.commit()