refactored validation
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user