Skip to content

Commit

Permalink
added user service to upgrade account to artist, added endpoint and t…
Browse files Browse the repository at this point in the history
…ests
  • Loading branch information
xiomaraR committed Aug 30, 2024
1 parent 3a74fb6 commit 1c1800f
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 3 deletions.
37 changes: 37 additions & 0 deletions Backend/app/spotify_electron/user/user/user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
48 changes: 46 additions & 2 deletions Backend/app/spotify_electron/user/user_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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())]
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions Backend/tests/test_API/api_test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
30 changes: 29 additions & 1 deletion Backend/tests/test__user.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand All @@ -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


Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit 1c1800f

Please sign in to comment.