137 lines
4.4 KiB
Python
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))
|