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

137 lines
4.4 KiB
Python

from typing import Annotated
from fastapi import APIRouter,Depends, Query
from fastapi.responses import JSONResponse
from fastapi import HTTPException
from fastapi.security import OAuth2PasswordRequestForm
from db_setup import get_session
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel, EmailStr
from users.views import User
from users.permissions import CurrentUser
from users.serializers import serialize_token
from users.plugins import create_access_token,create_refresh_token
from dotenv import load_dotenv
load_dotenv()
router = APIRouter()
class UserCreate(BaseModel):
name: str
email: EmailStr
password: str
role_id: int | None = None
is_active: bool = True
class UserUpdate(BaseModel):
name: str | None = None
email: EmailStr | None = None
password: str | None = None
role_id: int | None = None
is_active: bool | None = None
class TokenRefresh(BaseModel):
refresh_token: str
@router.post("/users/login")
async def login(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
session: AsyncSession = Depends(get_session),
):
try:
service=User(session=session)
user=await service.authenticate_user(form_data.username,form_data.password)
tokens=serialize_token(create_access_token(user),create_refresh_token(user),user)
return JSONResponse(content={**tokens,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.post("/users/refresh")
async def refresh(payload: TokenRefresh,session: AsyncSession = Depends(get_session)):
try:
service=User(session=session)
user=await service.refresh_access_token(payload.refresh_token)
tokens=serialize_token(create_access_token(user),create_refresh_token(user),user)
return JSONResponse(content={**tokens,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.get("/users/me")
async def me(current_user: CurrentUser):
try:
return JSONResponse(content={"data":current_user,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.post("/users/create")
async def create_user(payload: UserCreate,current_user: CurrentUser,session: AsyncSession = Depends(get_session)):
try:
service=User(session=session)
data=await service.create_user(payload.model_dump())
return JSONResponse(content={"data":data,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.get("/users/fetch")
async def fetch_users(
current_user: CurrentUser,
record_id: str | None = Query(None),
search: str | None = Query(None),
top: int | None = Query(None),
skip: int = Query(0, ge=0),
session: AsyncSession = Depends(get_session),
):
try:
service=User(session=session)
if record_id:
item=await service.get_user_by_id(record_id)
return JSONResponse(content={"data":item,"total":1,"status_code":200})
items=await service.get_users(top,skip,search)
total=await service.count_users(search)
return JSONResponse(content={"data":items,"total":total,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.put("/users/update")
async def update_user(payload: UserUpdate,current_user: CurrentUser,record_id: str = Query(...),session: AsyncSession = Depends(get_session)):
try:
service=User(session=session)
data=await service.update_user(record_id,payload.model_dump())
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("/users/delete")
async def delete_user(current_user: CurrentUser,record_id: str = Query(...),session: AsyncSession = Depends(get_session)):
try:
service=User(session=session)
data=await service.delete_user(record_id)
return JSONResponse(content={"data":data,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))