From a4931a1a3173ef2af73adc8e94ce651e33bb0bc2 Mon Sep 17 00:00:00 2001 From: Saurab-Shrestha Date: Thu, 8 Feb 2024 14:27:47 +0545 Subject: [PATCH] Added api for admin update user --- alembic/env.py | 2 +- private_gpt/users/api/v1/routers/users.py | 58 +++++++++++++++++++++++ private_gpt/users/crud/user_crud.py | 7 ++- private_gpt/users/crud/user_role_crud.py | 5 -- private_gpt/users/schemas/__init__.py | 2 +- private_gpt/users/schemas/user.py | 6 ++- private_gpt/users/schemas/user_role.py | 1 + 7 files changed, 70 insertions(+), 11 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index 238b121a..eb56a446 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -25,7 +25,7 @@ if config.config_file_name is not None: # add your model's MetaData object here # for 'autogenerate' support -# from myapp import mymodel +# from myapp import mymodel1w # target_metadata = mymodel.Base.metadata target_metadata = Base.metadata diff --git a/private_gpt/users/api/v1/routers/users.py b/private_gpt/users/api/v1/routers/users.py index 5a11fc82..9671cfc2 100644 --- a/private_gpt/users/api/v1/routers/users.py +++ b/private_gpt/users/api/v1/routers/users.py @@ -285,3 +285,61 @@ def delete_user( content={"message": "User deleted successfully"}, ) + + +@router.post("/update_user") +def admin_update_user( + *, + db: Session = Depends(deps.get_db), + user_update: schemas.UserAdminUpdate, + current_user: models.User = Security( + deps.get_current_user, + scopes=[Role.ADMIN["name"], Role.SUPER_ADMIN["name"]], + ), +) -> Any: + """ + Update the user by the Admin/Super_ADMIN + """ + existing_user = crud.user.get(db, id=user_update.id) + + if existing_user is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"User not found with id: {user_update.id}", + ) + if existing_user.fullname == user_update.fullname: + pass + else: + fullname = crud.user.get_by_name(db, name=user_update.fullname) + if fullname: + raise HTTPException( + status_code=409, + detail="The user with this username already exists!", + ) + + role = crud.role.get_by_name(db,name=user_update.role) + if role.id == 1: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Cannot create SUPER ADMIN!", + ) + + user_role = crud.user_role.get_by_user_id(db, user_id=existing_user.id) + role_in = schemas.UserRoleUpdate( + user_id = existing_user.id, + role_id = role.id, + ) + role = crud.user_role.update(db, db_obj=user_role, obj_in=role_in) + + user_in = schemas.UserUpdate(fullname=user_update.fullname, + email=existing_user.email, company_id=existing_user.user_role.company_id) + print("User in: ", user_in) + user = crud.user.update(db, db_obj=existing_user, obj_in=user_in) + + return JSONResponse( + status_code=status.HTTP_200_OK, + content={"message": "User updated successfully", + } + ) + + diff --git a/private_gpt/users/crud/user_crud.py b/private_gpt/users/crud/user_crud.py index fb21a24b..e0150317 100644 --- a/private_gpt/users/crud/user_crud.py +++ b/private_gpt/users/crud/user_crud.py @@ -3,7 +3,7 @@ from typing import Any, Dict, List, Optional, Union from private_gpt.users.core.security import get_password_hash, verify_password from private_gpt.users.crud.base import CRUDBase from private_gpt.users.models.user import User -from private_gpt.users.schemas.user import UserCreate, UserUpdate, AdminUpdate +from private_gpt.users.schemas.user import UserCreate, UserUpdate from private_gpt.users.models.user_role import UserRole from private_gpt.users.models.role import Role from sqlalchemy.orm import Session @@ -89,5 +89,8 @@ class CRUDUser(CRUDBase[User, UserCreate, UserUpdate]): .all() ) - + def get_by_name(self, db: Session, *, name: str) -> Optional[User]: + return db.query(self.model).filter(User.fullname == name).first() + + user = CRUDUser(User) \ No newline at end of file diff --git a/private_gpt/users/crud/user_role_crud.py b/private_gpt/users/crud/user_role_crud.py index c929e17e..ccceca22 100644 --- a/private_gpt/users/crud/user_role_crud.py +++ b/private_gpt/users/crud/user_role_crud.py @@ -16,10 +16,5 @@ class CRUDUserRole(CRUDBase[UserRole, UserRoleCreate, UserRoleUpdate]): self, db: Session, *, user_id: int )-> Optional[UserRole]: return db.query(UserRole).filter(UserRole.user_id == user_id).delete() - - # def update_user_role( - # self, db: Session, *, user_id: int, role_id: int - # ) -> Optional[UserRole]: - # return self.update(db, ) user_role = CRUDUserRole(UserRole) \ No newline at end of file diff --git a/private_gpt/users/schemas/__init__.py b/private_gpt/users/schemas/__init__.py index deb1a6af..4d68d2d4 100644 --- a/private_gpt/users/schemas/__init__.py +++ b/private_gpt/users/schemas/__init__.py @@ -1,6 +1,6 @@ from .role import Role, RoleCreate, RoleInDB, RoleUpdate from .token import TokenSchema, TokenPayload -from .user import User, UserCreate, UserInDB, UserUpdate, UserBaseSchema, Profile, UsernameUpdate, DeleteUser, AdminUpdate +from .user import User, UserCreate, UserInDB, UserUpdate, UserBaseSchema, Profile, UsernameUpdate, DeleteUser, UserAdminUpdate from .user_role import UserRole, UserRoleCreate, UserRoleInDB, UserRoleUpdate from .subscription import Subscription, SubscriptionBase, SubscriptionCreate, SubscriptionUpdate from .company import Company, CompanyBase, CompanyCreate, CompanyUpdate \ No newline at end of file diff --git a/private_gpt/users/schemas/user.py b/private_gpt/users/schemas/user.py index e932768e..5b42ff2a 100644 --- a/private_gpt/users/schemas/user.py +++ b/private_gpt/users/schemas/user.py @@ -58,6 +58,8 @@ class Profile(UserBaseSchema): class DeleteUser(BaseModel): id: int -class AdminUpdate(BaseModel): + +class UserAdminUpdate(BaseModel): + id: int fullname: str - role: int \ No newline at end of file + role: str \ No newline at end of file diff --git a/private_gpt/users/schemas/user_role.py b/private_gpt/users/schemas/user_role.py index 65894f50..1e569313 100644 --- a/private_gpt/users/schemas/user_role.py +++ b/private_gpt/users/schemas/user_role.py @@ -19,6 +19,7 @@ class UserRoleCreate(UserRoleBase): # Properties to receive via API on update class UserRoleUpdate(BaseModel): + user_id: int role_id: int class Config: