99 lines
3.5 KiB
Python
99 lines
3.5 KiB
Python
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))
|