Files
GoMembership/internal/utils/validators.go
$(pass /github/name) f99ff57275 minor
2024-09-07 08:56:33 +02:00

116 lines
3.0 KiB
Go

package utils
// import "regexp"
import (
"GoMembership/internal/database"
"GoMembership/internal/models"
"GoMembership/pkg/logger"
"reflect"
"slices"
"time"
"github.com/go-playground/validator/v10"
"github.com/jbub/banking/iban"
"github.com/jbub/banking/swift"
)
//
// func IsEmailValid(email string) bool {
// regex := `^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$`
// re := regexp.MustCompile(regex)
// return re.MatchString(email)
// }
func AgeValidator(fl validator.FieldLevel) bool {
fieldValue := fl.Field()
// Ensure the field is of type time.Time
// if fieldValue.Kind() != reflect.Struct || !fieldValue.Type().ConvertibleTo(reflect.TypeOf(time.Time{})) {
// return false
// }
dateOfBirth := fieldValue.Interface().(time.Time)
now := time.Now()
age := now.Year() - dateOfBirth.Year()
if now.YearDay() < dateOfBirth.YearDay() {
age-- // if birthday is in the future..
}
return age >= 18
}
func SubscriptionModelValidator(fl validator.FieldLevel) bool {
fieldValue := fl.Field().String()
var names []string
if err := database.DB.Model(&models.SubscriptionModel{}).Pluck("name", &names).Error; err != nil {
logger.Error.Fatalf("Couldn't get SubscriptionModel names: %#v", err)
return false
}
return slices.Contains(names, fieldValue)
}
func IBANValidator(fl validator.FieldLevel) bool {
fieldValue := fl.Field().String()
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)
logger.Info.Printf("Starting fieldValue Validation for %v: %#v", fieldName, fieldValue)
// Check if the fieldValue is valid
if !fieldValue.IsValid() {
return false
}
logger.Info.Printf("fieldValue is valid: %#v", fieldValue)
// Check if the fieldValue is a nil pointer
if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() {
return false
}
logger.Info.Println("fieldValue is not a nil pointer")
// Ensure that the fieldValue is an int64
var fieldInt64 int64
if fieldValue.Kind() == reflect.Int64 {
fieldInt64 = fieldValue.Int()
} else {
return false
}
logger.Info.Println("fieldValue is a int")
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("found ids of members: %#v", membershipIDs)
// 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()
return swift.Validate(fieldValue) == nil
}