import src.users.exceptions as exceptions import src.users.service as service from fastapi import APIRouter, Depends, HTTPException, Query from sqlmodel import Session from src import messages, models from src.auth.auth import get_current_user from src.database import get_session router = APIRouter(prefix='/users') @router.get('', response_model=list[models.UserPublic]) def get_users( session: Session = Depends(get_session), _: models.User = Depends(get_current_user), names: list[str] = Query([]), emails: list[str] = Query([]), ): return service.get_all( session, names, emails, ) @router.get('/roles', response_model=list[models.ContractType]) def get_roles( user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('roles', 'get all') ) return service.get_roles(session) @router.get( '/{_id}/preview-delete', response_model=list[models.DeleteDependency] ) async def preview_delete( _id: int, user: models.User = Depends(get_current_user), ): if not service.is_allowed(user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('user', 'delete') ) return [] @router.get('/{_id}', response_model=models.UserPublic) def get_user( _id: int, user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('user', 'get') ) result = service.get_one(session, _id) if result is None: raise HTTPException( status_code=404, detail=messages.Messages.not_found('user') ) return result @router.post('', response_model=models.UserPublic) def create_user( user: models.UserCreate, logged_user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(logged_user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('user', 'create') ) try: user = service.create_one(session, user) except exceptions.UserCreateError as error: raise HTTPException( status_code=400, detail=str(error) ) from error return user @router.put('/{_id}', response_model=models.UserPublic) def update_user( _id: int, user: models.UserUpdate, logged_user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(logged_user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('user', 'update') ) try: result = service.update_one(session, _id, user) except exceptions.UserNotFoundError as error: raise HTTPException( status_code=404, detail=messages.Messages.not_found('user') ) from error return result @router.delete('/{_id}', response_model=models.UserPublic) def delete_user( _id: int, user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(user): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('user', 'delete') ) try: result = service.delete_one(session, _id) except exceptions.UserNotFoundError as error: raise HTTPException( status_code=404, detail=messages.Messages.not_found('user') ) from error return result