from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.auth.dependencies import get_current_active_user from app.db import get_db_session from app.models.tool_definition import ToolDefinition from app.models.user import User from app.schemas.tool_definition import ( ToolDefinitionCreate, ToolDefinitionRead, ToolDefinitionUpdate, ) router = APIRouter(tags=["tool-definitions"]) @router.post("/tool-definitions", response_model=ToolDefinitionRead, status_code=status.HTTP_201_CREATED) # noqa: E501 async def create_tool_definition( td_in: ToolDefinitionCreate, current_user: User = Depends(get_current_active_user), session: AsyncSession = Depends(get_db_session), ) -> ToolDefinition: td = ToolDefinition(**td_in.model_dump()) session.add(td) await session.commit() await session.refresh(td) return td @router.get("/tool-definitions", response_model=list[ToolDefinitionRead]) async def list_tool_definitions( current_user: User = Depends(get_current_active_user), session: AsyncSession = Depends(get_db_session), ) -> list[ToolDefinition]: result = await session.execute(select(ToolDefinition)) return list(result.scalars().all()) @router.get("/tool-definitions/{tool_def_id}", response_model=ToolDefinitionRead) async def get_tool_definition( tool_def_id: UUID, current_user: User = Depends(get_current_active_user), session: AsyncSession = Depends(get_db_session), ) -> ToolDefinition: td = await session.get(ToolDefinition, tool_def_id) if not td: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Tool definition not found" ) return td @router.put("/tool-definitions/{tool_def_id}", response_model=ToolDefinitionRead) async def update_tool_definition( tool_def_id: UUID, td_in: ToolDefinitionUpdate, current_user: User = Depends(get_current_active_user), session: AsyncSession = Depends(get_db_session), ) -> ToolDefinition: td = await session.get(ToolDefinition, tool_def_id) if not td: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Tool definition not found" ) update_data = td_in.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(td, field, value) await session.commit() await session.refresh(td) return td @router.delete("/tool-definitions/{tool_def_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_tool_definition( tool_def_id: UUID, current_user: User = Depends(get_current_active_user), session: AsyncSession = Depends(get_db_session), ) -> None: td = await session.get(ToolDefinition, tool_def_id) if not td: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Tool definition not found" ) await session.delete(td) await session.commit()