From 1c1800fd92ed00a06affd635e3399d6beaa618f5 Mon Sep 17 00:00:00 2001 From: xiomara Date: Fri, 30 Aug 2024 01:34:05 -0400 Subject: [PATCH] added user service to upgrade account to artist, added endpoint and tests --- .../user/user/user_service.py | 37 ++++++++++++++ .../spotify_electron/user/user_controller.py | 48 ++++++++++++++++++- Backend/tests/test_API/api_test_user.py | 4 ++ Backend/tests/test__user.py | 30 +++++++++++- 4 files changed, 116 insertions(+), 3 deletions(-) diff --git a/Backend/app/spotify_electron/user/user/user_service.py b/Backend/app/spotify_electron/user/user/user_service.py index 7e2557e7..04e3ffd7 100644 --- a/Backend/app/spotify_electron/user/user/user_service.py +++ b/Backend/app/spotify_electron/user/user/user_service.py @@ -3,6 +3,7 @@ """ import app.auth.auth_service as auth_service +import app.spotify_electron.user.artist.artist_service as artist_service import app.spotify_electron.user.base_user_repository as base_user_repository import app.spotify_electron.user.providers.user_collection_provider as user_collection_provider import app.spotify_electron.user.user.user_repository as user_repository @@ -187,3 +188,39 @@ def search_by_name(name: str) -> list[UserDTO]: f"Unexpected error in User Service getting items by name {name}" ) raise UserServiceException from exception + + +# TODO make it a transaction +def upgrade_user_to_artist(user_name: str) -> None: + """Upgrade user account to artist account + + Args: + user_name (str): user name + + Raises: + UserNotFoundException: if the user does not exist + UserServiceException: unexpected error while upgrading user to artist + """ + try: + base_user_service.validate_user_name_parameter(user_name) + user = user_repository.get_user(user_name) + artist_service.create_artist(user.name, user.photo, user.password) + base_user_service.delete_user(user_name) + except UserBadNameException as exception: + user_service_logger.exception(f"Bad User Name Parameter: {user_name}") + raise UserBadNameException from exception + except UserNotFoundException as exception: + user_service_logger.exception(f"User not found: {user}") + raise UserNotFoundException from exception + except UserRepositoryException as exception: + user_service_logger.exception( + f"Unexpected error in User Repository upgrading user to artist: {user_name}" + ) + raise UserServiceException from exception + except Exception as exception: + user_service_logger.exception( + f"Unexpected error in User Service upgrading user to artist: {user_name}" + ) + raise UserServiceException from exception + else: + user_service_logger.info(f"Account {user_name} upgraded to artist successfully") diff --git a/Backend/app/spotify_electron/user/user_controller.py b/Backend/app/spotify_electron/user/user_controller.py index 5da6c3a1..2164afea 100644 --- a/Backend/app/spotify_electron/user/user_controller.py +++ b/Backend/app/spotify_electron/user/user_controller.py @@ -85,7 +85,9 @@ def get_user(name: str, token: Annotated[TokenData, Depends(JWTBearer())]) -> Re user = base_user_service.get_user(name) user_json = json_converter_utils.get_json_from_model(user) - return Response(user_json, media_type="application/json", status_code=HTTP_200_OK) + return Response( + user_json, media_type="application/json", status_code=HTTP_200_OK + ) except UserBadNameException: return Response( @@ -165,6 +167,46 @@ def delete_user(name: str) -> Response: ) +@router.patch("/{name}/upgrade_to_artist") +def upgrade_to_artist( + name: str, token: Annotated[TokenData, Depends(JWTBearer())] +) -> Response: + """Upgrade user to artist + + Args: + name (str): user name + """ + try: + user_service.upgrade_user_to_artist(name, token) + return Response(None, HTTP_204_NO_CONTENT) + except UserBadNameException: + return Response( + status_code=HTTP_400_BAD_REQUEST, + content=PropertiesMessagesManager.userBadName, + ) + except UserNotFoundException: + return Response( + status_code=HTTP_404_NOT_FOUND, + content=PropertiesMessagesManager.userNotFound, + ) + except UserUnauthorizedException: + return Response( + status_code=HTTP_403_FORBIDDEN, + content=PropertiesMessagesManager.userUnauthorized, + ) + except BadJWTTokenProvidedException: + return Response( + status_code=HTTP_403_FORBIDDEN, + content=PropertiesMessagesManager.tokenInvalidCredentials, + headers={"WWW-Authenticate": "Bearer"}, + ) + except (Exception, UserServiceException): + return Response( + status_code=HTTP_500_INTERNAL_SERVER_ERROR, + content=PropertiesMessagesManager.commonInternalServerError, + ) + + @router.patch("/{name}/playback_history") def patch_playback_history( name: str, song_name: str, token: Annotated[TokenData, Depends(JWTBearer())] @@ -325,7 +367,9 @@ def get_user_relevant_playlists(name: str) -> Response: try: playlists = base_user_service.get_user_relevant_playlists(name) playlists_json = json_converter_utils.get_json_from_model(playlists) - return Response(playlists_json, media_type="application/json", status_code=HTTP_200_OK) + return Response( + playlists_json, media_type="application/json", status_code=HTTP_200_OK + ) except UserBadNameException: return Response( status_code=HTTP_400_BAD_REQUEST, diff --git a/Backend/tests/test_API/api_test_user.py b/Backend/tests/test_API/api_test_user.py index 2996e077..fdc59d66 100644 --- a/Backend/tests/test_API/api_test_user.py +++ b/Backend/tests/test_API/api_test_user.py @@ -43,3 +43,7 @@ def delete_user(name: str) -> Response: def patch_history_playback(user_name: str, song_name: str) -> Response: return client.patch(f"/users/{user_name}/playback_history/?song_name={song_name}") + + +def upgrade_to_artist(name: str, headers=dict[str, str]) -> Response: + return client.patch(f"/users/{name}/upgrade_to_artist", headers=headers) diff --git a/Backend/tests/test__user.py b/Backend/tests/test__user.py index 3de8a1c8..a50914fd 100644 --- a/Backend/tests/test__user.py +++ b/Backend/tests/test__user.py @@ -6,6 +6,7 @@ HTTP_200_OK, HTTP_201_CREATED, HTTP_202_ACCEPTED, + HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND, HTTP_405_METHOD_NOT_ALLOWED, ) @@ -14,7 +15,12 @@ import app.spotify_electron.user.base_user_service as base_user_service import app.spotify_electron.user.user.user_service as user_service from app.auth.auth_schema import VerifyPasswordException -from tests.test_API.api_test_user import create_user, delete_user, get_user +from tests.test_API.api_test_user import ( + create_user, + delete_user, + get_user, + upgrade_to_artist, +) from tests.test_API.api_token import get_user_jwt_header @@ -101,6 +107,28 @@ def test_delete_user_invalid_name(clear_test_data_db): assert res_delete_user.status_code == HTTP_405_METHOD_NOT_ALLOWED +def test_upgrade_user_to_artist(clear_test_data_db): + name = "8232392323623823723" + photo = "https://photo" + password = "hola" + + res_create_user = create_user(name=name, password=password, photo=photo) + assert res_create_user.status_code == HTTP_201_CREATED + + jwt_headers = get_user_jwt_header(username=name, password=password) + + res_get_user = get_user(name=name, headers=jwt_headers) + assert res_get_user.status_code == HTTP_200_OK + assert res_get_user.json()["name"] == name + assert res_get_user.json()["photo"] == photo + + res_upgrade_user = upgrade_to_artist(name=name, headers=jwt_headers) + assert res_upgrade_user.status_code == HTTP_204_NO_CONTENT + + res_delete_user = delete_user(name=name) + assert res_delete_user.status_code == HTTP_202_ACCEPTED + + def test_check_encrypted_password_correct(): name = "8232392323623823723" photo = "https://photo"