import uuid from typing import Annotated from fastapi import APIRouter, Depends, status from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import require_admin from app.database import get_db from app.models.user import User from app.schemas.chat import ContextFileResponse, UpdateContextRequest from app.schemas.skill import ( CreateSkillRequest, SkillListResponse, SkillResponse, UpdateSkillRequest, ) from app.services import context_service, skill_service router = APIRouter(prefix="/admin", tags=["admin"]) # --- Context --- @router.get("/context", response_model=ContextFileResponse | None) async def get_primary_context( _admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): ctx = await context_service.get_primary_context(db) if not ctx: return None return ContextFileResponse.model_validate(ctx) @router.put("/context", response_model=ContextFileResponse) async def update_primary_context( data: UpdateContextRequest, admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): ctx = await context_service.upsert_primary_context(db, data.content, admin.id) return ContextFileResponse.model_validate(ctx) # --- Skills --- @router.get("/skills", response_model=SkillListResponse) async def list_general_skills( _admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): skills = await skill_service.get_general_skills(db) return SkillListResponse(skills=[SkillResponse.model_validate(s) for s in skills]) @router.post("/skills", response_model=SkillResponse, status_code=status.HTTP_201_CREATED) async def create_general_skill( data: CreateSkillRequest, _admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): skill = await skill_service.create_general_skill(db, **data.model_dump()) return SkillResponse.model_validate(skill) @router.patch("/skills/{skill_id}", response_model=SkillResponse) async def update_general_skill( skill_id: uuid.UUID, data: UpdateSkillRequest, _admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): skill = await skill_service.update_general_skill(db, skill_id, **data.model_dump(exclude_unset=True)) return SkillResponse.model_validate(skill) @router.delete("/skills/{skill_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_general_skill( skill_id: uuid.UUID, _admin: Annotated[User, Depends(require_admin)], db: Annotated[AsyncSession, Depends(get_db)], ): await skill_service.delete_general_skill(db, skill_id)