From 470cec7914af50a3396bb15155fda9165f9a2c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandra=20S=C3=A1nchez?= Date: Wed, 27 Dec 2023 14:37:29 -0500 Subject: [PATCH] Re-enable User update methods --- .../app/app/api/api_v1/endpoints/items.py | 8 +- .../app/app/api/api_v1/endpoints/users.py | 99 ++++++++++--------- src/backend/app/app/models.py | 6 ++ 3 files changed, 62 insertions(+), 51 deletions(-) diff --git a/src/backend/app/app/api/api_v1/endpoints/items.py b/src/backend/app/app/api/api_v1/endpoints/items.py index 99a83a2514..c72a28fd7f 100644 --- a/src/backend/app/app/api/api_v1/endpoints/items.py +++ b/src/backend/app/app/api/api_v1/endpoints/items.py @@ -1,7 +1,7 @@ -from typing import Annotated, Any +from typing import Any -from fastapi import APIRouter, Depends, HTTPException -from sqlmodel import Session, select +from fastapi import APIRouter, HTTPException +from sqlmodel import select from app.api.deps import CurrentUser, SessionDep from app.models import Item, ItemCreate, ItemOut, ItemUpdate @@ -90,4 +90,4 @@ def delete_item(session: SessionDep, current_user: CurrentUser, id: int) -> Any: raise HTTPException(status_code=400, detail="Not enough permissions") session.delete(item) session.commit() - return item + return item diff --git a/src/backend/app/app/api/api_v1/endpoints/users.py b/src/backend/app/app/api/api_v1/endpoints/users.py index 0c244f8036..f16a77d385 100644 --- a/src/backend/app/app/api/api_v1/endpoints/users.py +++ b/src/backend/app/app/api/api_v1/endpoints/users.py @@ -1,8 +1,6 @@ -from typing import Annotated, Any, List +from typing import Any, List -from fastapi import APIRouter, Body, Depends, HTTPException -from fastapi.encoders import jsonable_encoder -from pydantic.networks import EmailStr +from fastapi import APIRouter, Depends, HTTPException from sqlmodel import select from app import crud @@ -12,7 +10,14 @@ get_current_active_superuser, ) from app.core.config import settings -from app.models import User, UserCreate, UserCreateOpen, UserOut, UserUpdate +from app.models import ( + User, + UserCreate, + UserCreateOpen, + UserOut, + UserUpdate, + UserUpdateMe, +) from app.utils import send_new_account_email router = APIRouter() @@ -54,29 +59,24 @@ def create_user(*, session: SessionDep, user_in: UserCreate) -> Any: return user -# TODO: Refactor when SQLModel has update -# @router.put("/me") -# def update_user_me( -# *, -# session: SessionDep, -# password: Annotated[str, Body(None)], -# full_name: Annotated[str, Body(None)], -# email: Annotated[EmailStr, Body(None)], -# current_user: CurrentUser, -# ) -> UserOut: -# """ -# Update own user. -# """ -# current_user_data = jsonable_encoder(current_user) -# user_in = UserUpdate(**current_user_data) -# if password is not None: -# user_in.password = password -# if full_name is not None: -# user_in.full_name = full_name -# if email is not None: -# user_in.email = email -# user = crud.user.update(session, session_obj=current_user, obj_in=user_in) -# return user +@router.put("/me", response_model=UserOut) +def update_user_me( + *, session: SessionDep, body: UserUpdateMe, current_user: CurrentUser +) -> Any: + """ + Update own user. + """ + # TODO: Refactor when SQLModel has update + # current_user_data = jsonable_encoder(current_user) + # user_in = UserUpdate(**current_user_data) + # if password is not None: + # user_in.password = password + # if full_name is not None: + # user_in.full_name = full_name + # if email is not None: + # user_in.email = email + # user = crud.user.update(session, session_obj=current_user, obj_in=user_in) + # return user @router.get("/me", response_model=UserOut) @@ -127,22 +127,27 @@ def read_user_by_id( return user -# TODO: Refactor when SQLModel has update -# @router.put("/{user_id}", dependencies=[Depends(get_current_active_superuser)]) -# def update_user( -# *, -# session: SessionDep, -# user_id: int, -# user_in: UserUpdate, -# ) -> UserOut: -# """ -# Update a user. -# """ -# user = session.get(User, user_id) -# if not user: -# raise HTTPException( -# status_code=404, -# detail="The user with this username does not exist in the system", -# ) -# user = crud.user.update(session, db_obj=user, obj_in=user_in) -# return user # type: ignore +@router.put( + "/{user_id}", + dependencies=[Depends(get_current_active_superuser)], + response_model=UserOut, +) +def update_user( + *, + session: SessionDep, + user_id: int, + user_in: UserUpdate, +) -> Any: + """ + Update a user. + """ + + # TODO: Refactor when SQLModel has update + # user = session.get(User, user_id) + # if not user: + # raise HTTPException( + # status_code=404, + # detail="The user with this username does not exist in the system", + # ) + # user = crud.user.update(session, db_obj=user, obj_in=user_in) + # return user diff --git a/src/backend/app/app/models.py b/src/backend/app/app/models.py index ca860c2021..bb03308a70 100644 --- a/src/backend/app/app/models.py +++ b/src/backend/app/app/models.py @@ -29,6 +29,11 @@ class UserUpdate(UserBase): password: Union[str, None] = None +class UserUpdateMe(BaseModel): + password: Union[str, None] = None + full_name: Union[str, None] = None + email: Union[EmailStr, None] = None + # Database model, database table inferred from class name class User(UserBase, table=True): id: Union[int, None] = Field(default=None, primary_key=True) @@ -87,6 +92,7 @@ class Token(BaseModel): class TokenPayload(BaseModel): sub: Union[int, None] = None + class NewPassword(BaseModel): token: str new_password: str