HR-ATS-Portal/backend/verification_check/app.py

109 lines
3.8 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 users.permissions import PermissionTag, require_permission
from verification_check.enums import (
CompetencyEvaluation,
EmploymentVerification,
QualitativeEvaluation,
RecordOverview,
RefereeDetails,
)
from verification_check.views import VerificationCheckForm
router = APIRouter()
class VerificationCheckCreate(BaseModel):
recruiter_id:uuid.UUID
candidate_id:uuid.UUID
record_overview:Optional[RecordOverview]
employment_verification:Optional[EmploymentVerification]
competency_evaluation:Optional[CompetencyEvaluation]
qualitative_evaluation:Optional[QualitativeEvaluation]
referee:Optional[RefereeDetails]
class VerificationCheckUpdate(BaseModel):
recruiter_id:Optional[uuid.UUID]=None
candidate_id:Optional[uuid.UUID]=None
record_overview:Optional[RecordOverview]=None
employment_verification:Optional[EmploymentVerification]=None
competency_evaluation:Optional[CompetencyEvaluation]=None
qualitative_evaluation:Optional[QualitativeEvaluation]=None
referee:Optional[RefereeDetails]=None
@router.get("/verification-check/fetch")
async def fetch_verification_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=VerificationCheckForm(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("/verification-check/create")
async def create_verification_check(
payload: VerificationCheckCreate,
current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_CREATE)),
session:AsyncSession=Depends(get_session),
):
try:
service = VerificationCheckForm(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("/verification-check/update")
async def update_verification_check(
payload: VerificationCheckUpdate,
current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_EDIT)),
form_id:str=Query(...),
session:AsyncSession=Depends(get_session),
):
try:
service=VerificationCheckForm(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("/verification-check/delete")
async def delete_verification_check(
current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_DELETE)),
form_id:str=Query(...),
session:AsyncSession=Depends(get_session),
):
try:
service=VerificationCheckForm(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))