import uuid from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import JSONResponse from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from db_setup import get_session from reference_check.enums import ProfessionalFeedback, RecordOverview, RefereeSignOff from reference_check.views import ReferenceCheckForm from users.permissions import PermissionTag, require_permission router = APIRouter() class ReferenceCheckCreate(BaseModel): recruiter_id:uuid.UUID candidate_id:uuid.UUID record_overview:Optional[RecordOverview] professional_feedback:Optional[ProfessionalFeedback] referee_signoff:Optional[RefereeSignOff] class ReferenceCheckUpdate(BaseModel): recruiter_id:Optional[uuid.UUID]=None candidate_id:Optional[uuid.UUID]=None record_overview:Optional[RecordOverview]=None professional_feedback:Optional[ProfessionalFeedback]=None referee_signoff:Optional[RefereeSignOff]=None @router.get("/reference-check/fetch") async def fetch_reference_check( current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_VIEW)), form_id:str=Query(None), candidate_id:str=Query(None), session:AsyncSession=Depends(get_session), ): """One row by form_id, else the list (optionally one candidate's referees). Admins see every row; other roles stay scoped to created_by.""" try: service=ReferenceCheckForm(session=session) data=await service.get_form_by_id(form_id,candidate_id,current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/reference-check/create") async def create_reference_check( payload: ReferenceCheckCreate, current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_CREATE)), session:AsyncSession=Depends(get_session), ): try: service = ReferenceCheckForm(session=session) data = await service.create_form(payload.model_dump(exclude_unset=True), current_user) return JSONResponse(content={"data": data, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.patch("/reference-check/update") async def update_reference_check( payload: ReferenceCheckUpdate, current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_EDIT)), form_id:str=Query(...), session:AsyncSession=Depends(get_session), ): try: service=ReferenceCheckForm(session=session) data=await service.update_form(form_id,payload.model_dump(exclude_unset=True),current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e)) @router.delete("/reference-check/delete") async def delete_reference_check( current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_DELETE)), form_id:str=Query(...), session:AsyncSession=Depends(get_session), ): try: service=ReferenceCheckForm(session=session) data=await service.delete_form(form_id,current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e))