chg: nested struct loading

This commit is contained in:
Alex
2024-10-09 18:12:40 +02:00
parent b2e4947d37
commit 5de2f31e5f

View File

@@ -10,13 +10,13 @@ import (
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/pkg/errors" "GoMembership/pkg/errors"
"GoMembership/pkg/logger"
) )
type UserRepositoryInterface interface { type UserRepositoryInterface interface {
CreateUser(user *models.User) (uint, error) CreateUser(user *models.User) (uint, error)
UpdateUser(user *models.User) (*models.User, error) UpdateUser(user *models.User) (*models.User, error)
GetUsers(where map[string]interface{}) (*[]models.User, error) GetUsers(where map[string]interface{}) (*[]models.User, error)
GetUserByID(userID *uint) (*models.User, error)
GetUserByEmail(email string) (*models.User, error) GetUserByEmail(email string) (*models.User, error)
SetVerificationToken(verification *models.Verification) (uint, error) SetVerificationToken(verification *models.Verification) (uint, error)
IsVerified(userID *uint) (bool, error) IsVerified(userID *uint) (bool, error)
@@ -28,6 +28,7 @@ type UserRepository struct{}
func (ur *UserRepository) CreateUser(user *models.User) (uint, error) { func (ur *UserRepository) CreateUser(user *models.User) (uint, error) {
result := database.DB.Create(user) result := database.DB.Create(user)
if result.Error != nil { if result.Error != nil {
logger.Error.Printf("Create User error: %#v", result.Error)
return 0, result.Error return 0, result.Error
} }
return user.ID, nil return user.ID, nil
@@ -39,10 +40,14 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
} }
err := database.DB.Transaction(func(tx *gorm.DB) error { err := database.DB.Transaction(func(tx *gorm.DB) error {
if err := tx.First(&models.User{}, user.ID).Error; err != nil { // Check if the user exists in the database
var existingUser models.User
if err := tx.Preload("DriversLicence.LicenceCategories").
Preload("Membership").
First(&existingUser, user.ID).Error; err != nil {
return err return err
} }
// Update the user's main fields
result := tx.Session(&gorm.Session{FullSaveAssociations: true}).Updates(user) result := tx.Session(&gorm.Session{FullSaveAssociations: true}).Updates(user)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
@@ -50,6 +55,29 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
if result.RowsAffected == 0 { if result.RowsAffected == 0 {
return errors.ErrNoRowsAffected return errors.ErrNoRowsAffected
} }
// Handle the update of the LicenceCategories explicitly
if user.DriversLicence.ID != 0 {
// Replace the LicenceCategories with the new list
if err := tx.Model(&existingUser.DriversLicence).Association("LicenceCategories").Replace(user.DriversLicence.LicenceCategories); err != nil {
return err
}
}
// Update the Membership if provided
if user.Membership.ID != 0 {
if err := tx.Model(&existingUser.Membership).Updates(user.Membership).Error; err != nil {
return err
}
}
// Update the DriversLicence fields if provided
if user.DriversLicence.ID != 0 {
if err := tx.Model(&existingUser.DriversLicence).Updates(user.DriversLicence).Error; err != nil {
return err
}
}
return nil return nil
}) })
@@ -58,10 +86,11 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
} }
var updatedUser models.User var updatedUser models.User
if err := database.DB.First(&updatedUser, user.ID).Error; err != nil { if err := database.DB.Preload("DriversLicence.LicenceCategories").
Preload("Membership").
First(&updatedUser, user.ID).Error; err != nil {
return nil, err return nil, err
} }
return &updatedUser, nil return &updatedUser, nil
} }
@@ -81,7 +110,7 @@ func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User
return &users, nil return &users, nil
} }
func (ur *UserRepository) GetUserByID(userID *uint) (*models.User, error) { func GetUserByID(userID *uint) (*models.User, error) {
var user models.User var user models.User
result := database.DB. result := database.DB.
Preload(clause.Associations). Preload(clause.Associations).