From 77619c42bde70435378cf73002f06873801a4a90 Mon Sep 17 00:00:00 2001 From: Alex <$(pass /github/email)> Date: Fri, 7 Feb 2025 21:43:54 +0100 Subject: [PATCH] backend updateUser fix --- internal/controllers/user_controller.go | 8 -------- internal/repositories/user_repository.go | 7 +++++-- internal/services/user_service.go | 23 +++++++++++++++++++++++ internal/utils/response_handler.go | 2 ++ internal/validation/user_validation.go | 2 +- pkg/errors/errors.go | 1 + 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/internal/controllers/user_controller.go b/internal/controllers/user_controller.go index e3d4211..b1d1d9c 100644 --- a/internal/controllers/user_controller.go +++ b/internal/controllers/user_controller.go @@ -84,14 +84,6 @@ func (uc *UserController) UpdateHandler(c *gin.Context) { return } - // Validate subscription model - selectedModel, err := uc.MembershipService.GetModelByName(&user.Membership.SubscriptionModel.Name) - if err != nil { - utils.RespondWithError(c, err, "Error in UpdateHandler", http.StatusNotFound, "subscription_model", "server.validation.subscription_model_not_found") - return - } - user.Membership.SubscriptionModel = *selectedModel - updatedUser, err := uc.Service.UpdateUser(&user) if err != nil { utils.HandleUpdateError(c, err) diff --git a/internal/repositories/user_repository.go b/internal/repositories/user_repository.go index 10e18ee..446d3cf 100644 --- a/internal/repositories/user_repository.go +++ b/internal/repositories/user_repository.go @@ -51,9 +51,11 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) { err := database.DB.Transaction(func(tx *gorm.DB) error { // Check if the user exists in the database var existingUser models.User - if err := tx.Preload("Licence"). - Preload("Licence.Categories"). + + if err := tx.Preload(clause.Associations). Preload("Membership"). + Preload("Membership.SubscriptionModel"). + Preload("Licence.Categories"). First(&existingUser, user.ID).Error; err != nil { return err } @@ -109,6 +111,7 @@ func GetUserByID(userID *uint) (*models.User, error) { var user models.User result := database.DB. Preload(clause.Associations). + Preload("Membership"). Preload("Membership.SubscriptionModel"). Preload("Licence.Categories"). First(&user, userID) diff --git a/internal/services/user_service.go b/internal/services/user_service.go index ada1175..cf78454 100644 --- a/internal/services/user_service.go +++ b/internal/services/user_service.go @@ -41,6 +41,29 @@ func (service *UserService) UpdateUser(user *models.User) (*models.User, error) setPassword(user.Password, user) } + // Validate subscription model + selectedModel, err := repositories.GetModelByName(&user.Membership.SubscriptionModel.Name) + if err != nil { + return nil, errors.ErrSubscriptionNotFound + } + user.Membership.SubscriptionModel = *selectedModel + user.Membership.SubscriptionModelID = selectedModel.ID + + existingUser, err := service.GetUserByID(user.ID) + if err != nil { + return nil, err + } + + user.Membership.ID = existingUser.Membership.ID + + user.MembershipID = existingUser.MembershipID + if existingUser.Licence != nil { + user.Licence.ID = existingUser.Licence.ID + } + user.LicenceID = existingUser.LicenceID + user.BankAccount.ID = existingUser.BankAccount.ID + user.BankAccountID = existingUser.BankAccountID + // if user.Licence.Status == 0 { // // This is a new drivers licence // user.Licence.Status = constants.UnverifiedStatus diff --git a/internal/utils/response_handler.go b/internal/utils/response_handler.go index 81655cf..6da9239 100644 --- a/internal/utils/response_handler.go +++ b/internal/utils/response_handler.go @@ -42,6 +42,8 @@ func HandleUpdateError(c *gin.Context, err error) { RespondWithError(c, err, "Error while updating user", http.StatusNotFound, "user", "server.validation.user_not_found") case errors.ErrInvalidUserData: RespondWithError(c, err, "Error while updating user", http.StatusBadRequest, "user", "server.validation.invalid_user_data") + case errors.ErrSubscriptionNotFound: + RespondWithError(c, err, "Error while updating user", http.StatusBadRequest, "subscription", "server.validation.subscription_data") default: RespondWithError(c, err, "Error while updating user", http.StatusInternalServerError, "user", "server.error.internal_server_error") } diff --git a/internal/validation/user_validation.go b/internal/validation/user_validation.go index 82be122..c965c10 100644 --- a/internal/validation/user_validation.go +++ b/internal/validation/user_validation.go @@ -27,7 +27,7 @@ func validateUser(sl validator.StructLevel) { sl.ReportError(user.DateOfBirth, "DateOfBirth", "dateofbirth", "age", "") } // validate subscriptionModel - logger.Error.Printf("User: %#v", user) + logger.Error.Printf("User SubscriptionModel.Name: %#v", user.Membership.SubscriptionModel.Name) if user.Membership.SubscriptionModel.Name == "" { sl.ReportError(user.Membership.SubscriptionModel.Name, "SubscriptionModel.Name", "name", "required", "") } else { diff --git a/pkg/errors/errors.go b/pkg/errors/errors.go index 325df11..ad0a524 100644 --- a/pkg/errors/errors.go +++ b/pkg/errors/errors.go @@ -43,6 +43,7 @@ var ( ErrNotAuthorized = errors.New("not authorized") ValErrParentIDNotSet = errors.New("Parent Membership ID not provided") ValErrParentIDNotFound = errors.New("Parent Membership ID not found") + ErrSubscriptionNotFound = errors.New("Subscription Model not found") ) var Responses = struct {