From 97b8a4bcc951ee4651a1e6f30c41a601c0b530bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vit=C3=B3ria=20Silva?= <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed, 29 Jan 2025 22:31:47 +0000 Subject: [PATCH] Email+username validations + Strava callback view text + edit profile now uses unified modal [backend] add get user by email crud and route logic [frontend] add getUserByUsername logic and changed current to getUserContainsUsername [frontend] add text to Strava callback view [frontend] added username and email form validations to add and edit logic [frontend] profile edit logic now uses unified modal --- backend/app/users/crud.py | 28 ++- backend/app/users/router.py | 20 +- crowdin.yml | 2 + .../app/src/components/FooterComponent.vue | 2 +- .../Settings/SettingsUserProfileZone.vue | 154 +-------------- .../components/Settings/SettingsUsersZone.vue | 2 +- .../UsersAddEditUserModalComponent.vue | 177 ++++++++++++++---- .../SettingsUsersZone/UsersListComponent.vue | 86 --------- .../i18n/ca/strava/stravaCallbackView.json | 4 + .../i18n/de/strava/stravaCallbackView.json | 4 + .../i18n/fr/strava/stravaCallbackView.json | 4 + frontend/app/src/i18n/index.js | 10 + .../i18n/pt/strava/stravaCallbackView.json | 4 + .../usersAddEditUserModalComponent.json | 1 + frontend/app/src/i18n/us/generalItems.json | 3 + .../i18n/us/strava/stravaCallbackView.json | 4 + frontend/app/src/services/usersService.js | 8 +- .../src/views/Strava/StravaCallbackView.vue | 7 +- 18 files changed, 242 insertions(+), 278 deletions(-) create mode 100644 frontend/app/src/i18n/ca/strava/stravaCallbackView.json create mode 100644 frontend/app/src/i18n/de/strava/stravaCallbackView.json create mode 100644 frontend/app/src/i18n/fr/strava/stravaCallbackView.json create mode 100644 frontend/app/src/i18n/pt/strava/stravaCallbackView.json create mode 100644 frontend/app/src/i18n/us/strava/stravaCallbackView.json diff --git a/backend/app/users/crud.py b/backend/app/users/crud.py index d4b014c39..76df2e2c3 100644 --- a/backend/app/users/crud.py +++ b/backend/app/users/crud.py @@ -162,6 +162,32 @@ def get_user_by_username(username: str, db: Session): ) from err +def get_user_by_email(email: str, db: Session): + try: + # Get the user from the database + user = ( + db.query(users_models.User).filter(users_models.User.email == email).first() + ) + + # If the user was not found, return None + if user is None: + return None + + # Format the birthdate + user = users_utils.format_user_birthdate(user) + + # Return the user + return user + except Exception as err: + # Log the exception + core_logger.print_to_log(f"Error in get_user_by_email: {err}", "error", exc=err) + # Raise an HTTPException with a 500 Internal Server Error status code + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Internal Server Error", + ) from err + + def get_user_by_id(user_id: int, db: Session): try: # Get the user from the database @@ -247,7 +273,7 @@ def create_user(user: users_schema.UserCreate, db: Session): # Create a new user db_user = users_models.User( **user.model_dump(exclude={"password"}), - password=session_security.hash_password(user.password) + password=session_security.hash_password(user.password), ) # Add the user to the database diff --git a/backend/app/users/router.py b/backend/app/users/router.py index 4e2a5b5a2..8c7b82b4f 100644 --- a/backend/app/users/router.py +++ b/backend/app/users/router.py @@ -91,7 +91,25 @@ async def read_users_username( ], ): # Get the user from the database by username - return users_crud.get_user_by_username(username=username, db=db) + return users_crud.get_user_by_username(username, db) + + +@router.get( + "/email/{email}", + response_model=users_schema.User | None, +) +async def read_users_email( + email: str, + check_scopes: Annotated[ + Callable, Security(session_security.check_scopes, scopes=["users:read"]) + ], + db: Annotated[ + Session, + Depends(core_database.get_db), + ], +): + # Get the users from the database by email + return users_crud.get_user_by_email(email, db) @router.get("/id/{user_id}", response_model=users_schema.User) diff --git a/crowdin.yml b/crowdin.yml index ee7f7a34b..2568981c1 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -5,6 +5,8 @@ files: translation: /frontend/app/src/i18n/%two_letters_code%/components/%file_name%.%file_extension% - source: /frontend/app/src/i18n/us/gears/*.json translation: /frontend/app/src/i18n/%two_letters_code%/gears/%file_name%.%file_extension% + - source: /frontend/app/src/i18n/us/strava/*.json + translation: /frontend/app/src/i18n/%two_letters_code%/strava/%file_name%.%file_extension% - source: /frontend/app/src/i18n/us/components/activities/*.json translation: /frontend/app/src/i18n/%two_letters_code%/components/activities/%original_file_name% - source: /frontend/app/src/i18n/us/components/activities/modals/*.json diff --git a/frontend/app/src/components/FooterComponent.vue b/frontend/app/src/components/FooterComponent.vue index 3c42034ac..eb03a7565 100644 --- a/frontend/app/src/components/FooterComponent.vue +++ b/frontend/app/src/components/FooterComponent.vue @@ -68,7 +68,7 @@ export default { return; } try { - searchResults.value = await users.getUserByUsername(query); + searchResults.value = await users.getUserContainsUsername(query); } catch (error) { push.error(`${t('generalItems.errorFetchingInfo')} - ${error}`) } diff --git a/frontend/app/src/components/Settings/SettingsUserProfileZone.vue b/frontend/app/src/components/Settings/SettingsUserProfileZone.vue index 383024099..a19382834 100644 --- a/frontend/app/src/components/Settings/SettingsUserProfileZone.vue +++ b/frontend/app/src/components/Settings/SettingsUserProfileZone.vue @@ -32,73 +32,7 @@ {{ $t("settingsUserProfileZone.buttonEditProfile") }} - +
@@ -164,7 +98,6 @@