diff --git a/internal/controllers/user_controller.go b/internal/controllers/user_controller.go index 7e58fec..58aafac 100644 --- a/internal/controllers/user_controller.go +++ b/internal/controllers/user_controller.go @@ -32,7 +32,6 @@ func (uc *UserController) RegisterUser(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode userdata"}) return } - logger.Info.Printf("registering user: %#v", regData.User) selectedModel, err := uc.MembershipService.GetModelByName(®Data.User.Membership.SubscriptionModel.Name) if err != nil { @@ -41,6 +40,7 @@ func (uc *UserController) RegisterUser(c *gin.Context) { return } regData.User.Membership.SubscriptionModel = *selectedModel + logger.Info.Printf("REGISTERING user: %#v", regData.User) // Register User id, token, err := uc.Service.RegisterUser(®Data.User) if err != nil { diff --git a/internal/models/subscription_model.go b/internal/models/subscription_model.go index b2b1aee..156611a 100644 --- a/internal/models/subscription_model.go +++ b/internal/models/subscription_model.go @@ -5,14 +5,15 @@ import ( ) type SubscriptionModel struct { - CreatedAt time.Time - UpdatedAt time.Time - Name string `json:"name" validate:"required,alphaunicode,subscriptionModel"` - Details string `json:"details" validate:"required"` - Conditions string `json:"conditions" validate:"required"` - ID int64 `gorm:"primaryKey"` - MonthlyFee float32 `json:"monthly_fee" validate:"required,number"` - HourlyRate float32 `json:"hourly_rate" validate:"required,number"` - IncludedPerYear int16 `json:"included_hours_per_year" validate:"omitempty,number"` - IncludedPerMonth int16 `json:"included_hours_per_month" validate:"omitempty,number"` + CreatedAt time.Time + UpdatedAt time.Time + Name string `json:"name" validate:"required,subscriptionModel"` + Details string `json:"details" validate:"required"` + Conditions string `json:"conditions"` + RequiredMembershipField string `json:"required_membership_field" validate:"membershipField"` + ID int64 `gorm:"primaryKey"` + MonthlyFee float32 `json:"monthly_fee" validate:"required,number"` + HourlyRate float32 `json:"hourly_rate" validate:"required,number"` + IncludedPerYear int16 `json:"included_hours_per_year" validate:"omitempty,number"` + IncludedPerMonth int16 `json:"included_hours_per_month" validate:"omitempty,number"` } diff --git a/internal/repositories/user_repository.go b/internal/repositories/user_repository.go index 6b9ffe1..bbc0bca 100644 --- a/internal/repositories/user_repository.go +++ b/internal/repositories/user_repository.go @@ -12,7 +12,6 @@ import ( "GoMembership/internal/models" "GoMembership/pkg/errors" - "GoMembership/pkg/logger" ) type UserRepositoryInterface interface { @@ -36,7 +35,7 @@ func (ur *UserRepository) CreateUser(user *models.User) (int64, error) { } func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error { - logger.Info.Printf("Updating User: %#v\n", user) + // logger.Info.Printf("Updating User: %#v\n", user) if user == nil { return errors.ErrNoData } @@ -54,7 +53,7 @@ func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error { func (ur *UserRepository) FindUserByID(id int64) (*models.User, error) { var user models.User - result := database.DB.Preload("Consents").Preload("BankAccount").Preload("Verification").Preload("Membership").First(&user, id) + result := database.DB.Preload("Consents").Preload("BankAccount").Preload("Verification").Preload("Membership").Preload("Subscription").First(&user, id) if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { return nil, gorm.ErrRecordNotFound diff --git a/internal/services/user_service.go b/internal/services/user_service.go index 8ed25f6..9a6ebdb 100644 --- a/internal/services/user_service.go +++ b/internal/services/user_service.go @@ -75,7 +75,7 @@ func validateRegistrationData(user *models.User) error { validate.RegisterValidation("bic", utils.BICValidator) validate.RegisterValidation("iban", utils.IBANValidator) validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator) - + validate.RegisterValidation("membershipField", utils.ValidateRequiredMembershipField) return validate.Struct(user) } diff --git a/internal/utils/validators.go b/internal/utils/validators.go index 99e63f8..7fe889c 100644 --- a/internal/utils/validators.go +++ b/internal/utils/validators.go @@ -4,15 +4,15 @@ package utils import ( // "reflect" - "time" - "GoMembership/internal/database" "GoMembership/internal/models" "GoMembership/pkg/logger" "github.com/go-playground/validator/v10" "github.com/jbub/banking/iban" "github.com/jbub/banking/swift" + "reflect" "slices" + "time" ) // @@ -55,6 +55,37 @@ func IBANValidator(fl validator.FieldLevel) bool { return iban.Validate(fieldValue) == nil } +func ValidateRequiredMembershipField(fl validator.FieldLevel) bool { + user := fl.Top().Interface().(*models.User) + membership := user.Membership + subModel := membership.SubscriptionModel + + // Get the field name specified in RequiredMembershipField + fieldName := subModel.RequiredMembershipField + if fieldName == "" { + return true + } + + // Get the value of the field specified by RequiredMembershipField + fieldValue := reflect.ValueOf(membership).FieldByName(fieldName) + // Ensure that the fieldValue is an int64 + var fieldInt64 int64 + if fieldValue.Kind() == reflect.Int64 { + fieldInt64 = fieldValue.Int() + } else { + return false + } + var membershipIDs []int64 + if err := database.DB.Model(&models.Membership{}).Pluck("id", &membershipIDs).Error; err != nil { + logger.Error.Fatalf("Couldn't get SubscriptionModel names: %#v", err) + return false + } + + // logger.Info.Printf("FIELD_NAME: %#v\nVALUE: %#v", fieldName, fieldValue) + // Check if the field value is zero (empty) + return slices.Contains(membershipIDs, fieldInt64) +} + func BICValidator(fl validator.FieldLevel) bool { fieldValue := fl.Field().String()