diff --git a/go-backend/internal/validation/membership_validation.go b/go-backend/internal/validation/membership_validation.go index 35ded4e..4666d2a 100644 --- a/go-backend/internal/validation/membership_validation.go +++ b/go-backend/internal/validation/membership_validation.go @@ -2,39 +2,37 @@ package validation import ( "GoMembership/internal/models" - "GoMembership/internal/repositories" "GoMembership/pkg/errors" "GoMembership/pkg/logger" "github.com/go-playground/validator/v10" + "gorm.io/gorm" ) -func validateMembership(sl validator.StructLevel) { - membership := sl.Current().Interface().(models.User).Membership - if membership.SubscriptionModel.RequiredMembershipField != "" { - switch membership.SubscriptionModel.RequiredMembershipField { +func validateMembership(db *gorm.DB, user *models.User, sl validator.StructLevel) { + if user.Membership.SubscriptionModel.RequiredMembershipField != "" { + switch user.Membership.SubscriptionModel.RequiredMembershipField { case "ParentMembershipID": - if err := CheckParentMembershipID(membership); err != nil { + if err := CheckParentMembershipID(db, user); err != nil { logger.Error.Printf("Error ParentMembershipValidation: %v", err.Error()) - sl.ReportError(membership.ParentMembershipID, membership.SubscriptionModel.RequiredMembershipField, + sl.ReportError(user.Membership.ParentMembershipID, user.Membership.SubscriptionModel.RequiredMembershipField, "RequiredMembershipField", "invalid", "") } default: logger.Error.Printf("Error no matching RequiredMembershipField: %v", errors.ErrInvalidValue.Error()) - sl.ReportError(membership.ParentMembershipID, membership.SubscriptionModel.RequiredMembershipField, + sl.ReportError(user.Membership.ParentMembershipID, user.Membership.SubscriptionModel.RequiredMembershipField, "RequiredMembershipField", "not_implemented", "") } - } } -func CheckParentMembershipID(membership models.Membership) error { +func CheckParentMembershipID(db *gorm.DB, user *models.User) error { - if membership.ParentMembershipID == 0 { + if user.Membership.ParentMembershipID == 0 { return errors.ValErrParentIDNotSet } else { - _, err := repositories.GetUserByID(&membership.ParentMembershipID) - if err != nil { + var parent models.User + if err := parent.FromID(db, &user.Membership.ParentMembershipID); err != nil { return errors.ValErrParentIDNotFound } } diff --git a/go-backend/internal/validation/setup.go b/go-backend/internal/validation/setup.go index bd9dddd..0ae7ec5 100644 --- a/go-backend/internal/validation/setup.go +++ b/go-backend/internal/validation/setup.go @@ -4,17 +4,18 @@ import ( "GoMembership/internal/models" "github.com/gin-gonic/gin/binding" + "gorm.io/gorm" "github.com/go-playground/validator/v10" ) -func SetupValidators() { +func SetupValidators(db *gorm.DB) { if v, ok := binding.Validator.Engine().(*validator.Validate); ok { // Register custom validators v.RegisterValidation("safe_content", ValidateSafeContent) // Register struct-level validations - v.RegisterStructValidation(ValidateUser, models.User{}) + v.RegisterStructValidation(ValidateUserFactory(db), models.User{}) v.RegisterStructValidation(ValidateSubscription, models.SubscriptionModel{}) } } diff --git a/go-backend/internal/validation/user_validation.go b/go-backend/internal/validation/user_validation.go index 7ef2665..0291dd0 100644 --- a/go-backend/internal/validation/user_validation.go +++ b/go-backend/internal/validation/user_validation.go @@ -1,7 +1,6 @@ package validation import ( - "GoMembership/internal/constants" "GoMembership/internal/models" "GoMembership/internal/repositories" "GoMembership/pkg/logger" @@ -10,6 +9,7 @@ import ( "github.com/go-playground/validator/v10" passwordvalidator "github.com/wagslane/go-password-validator" + "gorm.io/gorm" ) var passwordErrorTranslations = map[string]string{ @@ -21,11 +21,15 @@ var passwordErrorTranslations = map[string]string{ "using numbers": "server.validation.numbers", } -func ValidateUser(sl validator.StructLevel) { +func ValidateUserFactory(db *gorm.DB) validator.StructLevelFunc { + return func(sl validator.StructLevel) { + validateUser(db, sl) + } +} + +func validateUser(db *gorm.DB, sl validator.StructLevel) { user := sl.Current().Interface().(models.User) - isSuper := user.RoleID >= constants.Roles.Admin - isSupporter := user.RoleID == constants.Roles.Supporter // validate subscriptionModel if user.Membership.SubscriptionModel.Name == "" { sl.ReportError(user.Membership.SubscriptionModel.Name, "subscription.name", "name", "required", "") @@ -38,7 +42,7 @@ func ValidateUser(sl validator.StructLevel) { user.Membership.SubscriptionModel = *selectedModel } } - if isSupporter { + if user.IsSupporter() { if user.BankAccount.IBAN != "" { validateBankAccount(sl) } @@ -54,9 +58,9 @@ func ValidateUser(sl validator.StructLevel) { if user.DateOfBirth.After(time.Now().AddDate(-18, 0, 0)) { sl.ReportError(user.DateOfBirth, "user.user", "user.dateofbirth", "age", "") } - validateMembership(sl) + validateMembership(db, &user, sl) - if isSuper { + if user.IsAdmin() { return }