import uuid from typing import Annotated from fastapi import APIRouter, Depends, Query, status from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.database import get_db from app.models.user import User from app.schemas.skill import ( CreateSkillRequest, SkillListResponse, SkillResponse, UpdateSkillRequest, ) from app.services import skill_service router = APIRouter(prefix="/skills", tags=["skills"]) @router.get("/", response_model=SkillListResponse) async def list_skills( user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], include_general: bool = Query(default=True), ): skills = await skill_service.get_accessible_skills(db, user.id, include_general) return SkillListResponse(skills=[SkillResponse.model_validate(s) for s in skills]) @router.post("/", response_model=SkillResponse, status_code=status.HTTP_201_CREATED) async def create_skill( data: CreateSkillRequest, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): skill = await skill_service.create_personal_skill(db, user.id, **data.model_dump()) return SkillResponse.model_validate(skill) @router.get("/{skill_id}", response_model=SkillResponse) async def get_skill( skill_id: uuid.UUID, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): skill = await skill_service.get_skill(db, skill_id, user.id) return SkillResponse.model_validate(skill) @router.patch("/{skill_id}", response_model=SkillResponse) async def update_skill( skill_id: uuid.UUID, data: UpdateSkillRequest, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): skill = await skill_service.update_personal_skill( db, skill_id, user.id, **data.model_dump(exclude_unset=True) ) return SkillResponse.model_validate(skill) @router.delete("/{skill_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_skill( skill_id: uuid.UUID, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): await skill_service.delete_personal_skill(db, skill_id, user.id)