refactored validation

This commit is contained in:
Alex
2025-03-11 20:46:45 +01:00
parent c8d0904fd7
commit feb8abcc42
3 changed files with 25 additions and 22 deletions

View File

@@ -2,39 +2,37 @@ package validation
import ( import (
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/internal/repositories"
"GoMembership/pkg/errors" "GoMembership/pkg/errors"
"GoMembership/pkg/logger" "GoMembership/pkg/logger"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"gorm.io/gorm"
) )
func validateMembership(sl validator.StructLevel) { func validateMembership(db *gorm.DB, user *models.User, sl validator.StructLevel) {
membership := sl.Current().Interface().(models.User).Membership if user.Membership.SubscriptionModel.RequiredMembershipField != "" {
if membership.SubscriptionModel.RequiredMembershipField != "" { switch user.Membership.SubscriptionModel.RequiredMembershipField {
switch membership.SubscriptionModel.RequiredMembershipField {
case "ParentMembershipID": case "ParentMembershipID":
if err := CheckParentMembershipID(membership); err != nil { if err := CheckParentMembershipID(db, user); err != nil {
logger.Error.Printf("Error ParentMembershipValidation: %v", err.Error()) 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", "") "RequiredMembershipField", "invalid", "")
} }
default: default:
logger.Error.Printf("Error no matching RequiredMembershipField: %v", errors.ErrInvalidValue.Error()) 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", "") "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 return errors.ValErrParentIDNotSet
} else { } else {
_, err := repositories.GetUserByID(&membership.ParentMembershipID) var parent models.User
if err != nil { if err := parent.FromID(db, &user.Membership.ParentMembershipID); err != nil {
return errors.ValErrParentIDNotFound return errors.ValErrParentIDNotFound
} }
} }

View File

@@ -4,17 +4,18 @@ import (
"GoMembership/internal/models" "GoMembership/internal/models"
"github.com/gin-gonic/gin/binding" "github.com/gin-gonic/gin/binding"
"gorm.io/gorm"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
) )
func SetupValidators() { func SetupValidators(db *gorm.DB) {
if v, ok := binding.Validator.Engine().(*validator.Validate); ok { if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// Register custom validators // Register custom validators
v.RegisterValidation("safe_content", ValidateSafeContent) v.RegisterValidation("safe_content", ValidateSafeContent)
// Register struct-level validations // Register struct-level validations
v.RegisterStructValidation(ValidateUser, models.User{}) v.RegisterStructValidation(ValidateUserFactory(db), models.User{})
v.RegisterStructValidation(ValidateSubscription, models.SubscriptionModel{}) v.RegisterStructValidation(ValidateSubscription, models.SubscriptionModel{})
} }
} }

View File

@@ -1,7 +1,6 @@
package validation package validation
import ( import (
"GoMembership/internal/constants"
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/internal/repositories" "GoMembership/internal/repositories"
"GoMembership/pkg/logger" "GoMembership/pkg/logger"
@@ -10,6 +9,7 @@ import (
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
passwordvalidator "github.com/wagslane/go-password-validator" passwordvalidator "github.com/wagslane/go-password-validator"
"gorm.io/gorm"
) )
var passwordErrorTranslations = map[string]string{ var passwordErrorTranslations = map[string]string{
@@ -21,11 +21,15 @@ var passwordErrorTranslations = map[string]string{
"using numbers": "server.validation.numbers", "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) user := sl.Current().Interface().(models.User)
isSuper := user.RoleID >= constants.Roles.Admin
isSupporter := user.RoleID == constants.Roles.Supporter
// validate subscriptionModel // validate subscriptionModel
if user.Membership.SubscriptionModel.Name == "" { if user.Membership.SubscriptionModel.Name == "" {
sl.ReportError(user.Membership.SubscriptionModel.Name, "subscription.name", "name", "required", "") sl.ReportError(user.Membership.SubscriptionModel.Name, "subscription.name", "name", "required", "")
@@ -38,7 +42,7 @@ func ValidateUser(sl validator.StructLevel) {
user.Membership.SubscriptionModel = *selectedModel user.Membership.SubscriptionModel = *selectedModel
} }
} }
if isSupporter { if user.IsSupporter() {
if user.BankAccount.IBAN != "" { if user.BankAccount.IBAN != "" {
validateBankAccount(sl) validateBankAccount(sl)
} }
@@ -54,9 +58,9 @@ func ValidateUser(sl validator.StructLevel) {
if user.DateOfBirth.After(time.Now().AddDate(-18, 0, 0)) { if user.DateOfBirth.After(time.Now().AddDate(-18, 0, 0)) {
sl.ReportError(user.DateOfBirth, "user.user", "user.dateofbirth", "age", "") sl.ReportError(user.DateOfBirth, "user.user", "user.dateofbirth", "age", "")
} }
validateMembership(sl) validateMembership(db, &user, sl)
if isSuper { if user.IsAdmin() {
return return
} }