package validation import ( "GoMembership/internal/models" "GoMembership/internal/repositories" "GoMembership/pkg/logger" "time" "github.com/go-playground/validator/v10" ) func validateUser(sl validator.StructLevel) { user := sl.Current().Interface().(models.User) if user.DateOfBirth.After(time.Now().AddDate(-18, 0, 0)) { sl.ReportError(user.DateOfBirth, "DateOfBirth", "date_of_birth", "age", "") } if user.Membership.SubscriptionModel.Name == "" { sl.ReportError(user.Membership.SubscriptionModel.Name, "SubscriptionModel.Name", "name", "required", "") } else { selectedModel, err := repositories.GetModelByName(&user.Membership.SubscriptionModel.Name) if err != nil { logger.Error.Printf("Error finding subscription model for user %v: %v", user.Email, err) sl.ReportError(user.Membership.SubscriptionModel.Name, "SubscriptionModel.Name", "name", "invalid", "") } else { user.Membership.SubscriptionModel = *selectedModel } } validateMembership(sl, user.Membership) } // func RequiredIfNotAdmin(fl validator.FieldLevel) bool { // // Traverse up the struct hierarchy to find the IsAdmin field // current := fl.Parent() // // Check multiple levels of nesting to find userRole // for current.IsValid() { // if isRoleIDField := current.FieldByName("RoleID"); isRoleIDField.IsValid() { // // If IsAdmin is found and is true, skip validation // if isRoleIDField.Interface().(int8) == constants.Roles.Admin{ // return true // } // break // } // current = current.Parent() // Move to the next parent level // } // If not an admin, enforce that the field must have a non-zero value // return !fl.Field().IsZero() // }