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

86 lines
2.7 KiB
Python

from fastapi import APIRouter,Depends
from fastapi.responses import JSONResponse
from fastapi import HTTPException
from pydantic import BaseModel
from db_setup import get_session
from sqlalchemy.ext.asyncio import AsyncSession
from interview.views import Calendar
from users.permissions import PermissionTag,require_permission
from dotenv import load_dotenv
load_dotenv()
router = APIRouter()
class CalendarCreateBody(BaseModel):
duration_minutes: int | None = 30
class CalendarRescheduleBody(BaseModel):
instant: str
duration_minutes: int | None = 30
class CalendarCancelBody(BaseModel):
comment: str | None = None
@router.post("/interview/{interview_id}/calendar-event")
async def create_calendar_event(
interview_id: str,
payload: CalendarCreateBody | None = None,
current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_CREATE)),
session: AsyncSession = Depends(get_session),
):
try:
body=payload or CalendarCreateBody()
service=Calendar(session=session)
data=await service.create_for_interview(
interview_id,
duration_minutes=body.duration_minutes,
)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.patch("/interview/{interview_id}/calendar-event/reschedule")
async def reschedule_calendar_event(
interview_id: str,
payload: CalendarRescheduleBody,
current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_EDIT)),
session: AsyncSession = Depends(get_session),
):
try:
service=Calendar(session=session)
data=await service.reschedule_for_interview(
interview_id,
instant=payload.instant,
duration_minutes=payload.duration_minutes,
)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.post("/interview/{interview_id}/calendar-event/cancel")
async def cancel_calendar_event(
interview_id: str,
payload: CalendarCancelBody | None = None,
current_user: dict = Depends(require_permission(PermissionTag.INTERVIEWS_EDIT)),
session: AsyncSession = Depends(get_session),
):
try:
body=payload or CalendarCancelBody()
service=Calendar(session=session)
data=await service.cancel_for_interview(interview_id,comment=body.comment)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))