from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import JSONResponse from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from candidate_forms.plugins import definitions_payload from candidate_forms.views import CandidateForm from db_setup import get_session from users.permissions import PermissionTag, require_permission router = APIRouter() class FormCreate(BaseModel): form_type: str inbox_id: int | None = None manual_upload_candidate_id: str | None = None job_post_id: str | None = None interviewer_id: str | None = None form_date: datetime | None = None sections: list | None = None fields: dict | None = None recommendation: str | None = None class FormUpdate(BaseModel): interviewer_id: str | None = None form_date: datetime | None = None sections: list | None = None fields: dict | None = None recommendation: str | None = None @router.get("/forms/definitions") async def fetch_form_definitions( current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_VIEW)), ): try: return JSONResponse(content={"data": definitions_payload(), "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/forms/fetch") async def fetch_forms( current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_VIEW)), form_id: str | None = Query(None), inbox_id: int | None = Query(None), manual_upload_candidate_id: str | None = Query(None), job_post_id: str | None = Query(None), form_type: str | None = Query(None), top: int | None = Query(None), skip: int = Query(0, ge=0), session: AsyncSession = Depends(get_session), ): try: service = CandidateForm(session=session) data, summary, total = await service.get_forms( form_id, inbox_id, manual_upload_candidate_id, job_post_id, form_type, top, skip, ) return JSONResponse( content={"data": data, "summary": summary, "total": total, "status_code": 200} ) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/forms/create") async def create_form( payload: FormCreate, current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_CREATE)), session: AsyncSession = Depends(get_session), ): try: service = CandidateForm(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("/forms/update") async def update_form( payload: FormUpdate, current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_EDIT)), form_id: str = Query(...), session: AsyncSession = Depends(get_session), ): try: service = CandidateForm(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("/forms/delete") async def delete_form( current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_DELETE)), form_id: str = Query(...), session: AsyncSession = Depends(get_session), ): try: service = CandidateForm(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))