added parentmembershipvalidation

This commit is contained in:
$(pass /github/name)
2024-07-12 16:01:16 +02:00
parent d8115f512d
commit 02647c4cf7
5 changed files with 48 additions and 17 deletions

View File

@@ -32,7 +32,6 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode userdata"}) c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode userdata"})
return return
} }
logger.Info.Printf("registering user: %#v", regData.User)
selectedModel, err := uc.MembershipService.GetModelByName(&regData.User.Membership.SubscriptionModel.Name) selectedModel, err := uc.MembershipService.GetModelByName(&regData.User.Membership.SubscriptionModel.Name)
if err != nil { if err != nil {
@@ -41,6 +40,7 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
return return
} }
regData.User.Membership.SubscriptionModel = *selectedModel regData.User.Membership.SubscriptionModel = *selectedModel
logger.Info.Printf("REGISTERING user: %#v", regData.User)
// Register User // Register User
id, token, err := uc.Service.RegisterUser(&regData.User) id, token, err := uc.Service.RegisterUser(&regData.User)
if err != nil { if err != nil {

View File

@@ -5,14 +5,15 @@ import (
) )
type SubscriptionModel struct { type SubscriptionModel struct {
CreatedAt time.Time CreatedAt time.Time
UpdatedAt time.Time UpdatedAt time.Time
Name string `json:"name" validate:"required,alphaunicode,subscriptionModel"` Name string `json:"name" validate:"required,subscriptionModel"`
Details string `json:"details" validate:"required"` Details string `json:"details" validate:"required"`
Conditions string `json:"conditions" validate:"required"` Conditions string `json:"conditions"`
ID int64 `gorm:"primaryKey"` RequiredMembershipField string `json:"required_membership_field" validate:"membershipField"`
MonthlyFee float32 `json:"monthly_fee" validate:"required,number"` ID int64 `gorm:"primaryKey"`
HourlyRate float32 `json:"hourly_rate" validate:"required,number"` MonthlyFee float32 `json:"monthly_fee" validate:"required,number"`
IncludedPerYear int16 `json:"included_hours_per_year" validate:"omitempty,number"` HourlyRate float32 `json:"hourly_rate" validate:"required,number"`
IncludedPerMonth int16 `json:"included_hours_per_month" validate:"omitempty,number"` IncludedPerYear int16 `json:"included_hours_per_year" validate:"omitempty,number"`
IncludedPerMonth int16 `json:"included_hours_per_month" validate:"omitempty,number"`
} }

View File

@@ -12,7 +12,6 @@ import (
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/pkg/errors" "GoMembership/pkg/errors"
"GoMembership/pkg/logger"
) )
type UserRepositoryInterface interface { type UserRepositoryInterface interface {
@@ -36,7 +35,7 @@ func (ur *UserRepository) CreateUser(user *models.User) (int64, error) {
} }
func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error { func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error {
logger.Info.Printf("Updating User: %#v\n", user) // logger.Info.Printf("Updating User: %#v\n", user)
if user == nil { if user == nil {
return errors.ErrNoData return errors.ErrNoData
} }
@@ -54,7 +53,7 @@ func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error {
func (ur *UserRepository) FindUserByID(id int64) (*models.User, error) { func (ur *UserRepository) FindUserByID(id int64) (*models.User, error) {
var user models.User var user models.User
result := database.DB.Preload("Consents").Preload("BankAccount").Preload("Verification").Preload("Membership").First(&user, id) result := database.DB.Preload("Consents").Preload("BankAccount").Preload("Verification").Preload("Membership").Preload("Subscription").First(&user, id)
if result.Error != nil { if result.Error != nil {
if result.Error == gorm.ErrRecordNotFound { if result.Error == gorm.ErrRecordNotFound {
return nil, gorm.ErrRecordNotFound return nil, gorm.ErrRecordNotFound

View File

@@ -75,7 +75,7 @@ func validateRegistrationData(user *models.User) error {
validate.RegisterValidation("bic", utils.BICValidator) validate.RegisterValidation("bic", utils.BICValidator)
validate.RegisterValidation("iban", utils.IBANValidator) validate.RegisterValidation("iban", utils.IBANValidator)
validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator) validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator)
validate.RegisterValidation("membershipField", utils.ValidateRequiredMembershipField)
return validate.Struct(user) return validate.Struct(user)
} }

View File

@@ -4,15 +4,15 @@ package utils
import ( import (
// "reflect" // "reflect"
"time"
"GoMembership/internal/database" "GoMembership/internal/database"
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/pkg/logger" "GoMembership/pkg/logger"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"github.com/jbub/banking/iban" "github.com/jbub/banking/iban"
"github.com/jbub/banking/swift" "github.com/jbub/banking/swift"
"reflect"
"slices" "slices"
"time"
) )
// //
@@ -55,6 +55,37 @@ func IBANValidator(fl validator.FieldLevel) bool {
return iban.Validate(fieldValue) == nil 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)
// Ensure that the fieldValue is an int64
var fieldInt64 int64
if fieldValue.Kind() == reflect.Int64 {
fieldInt64 = fieldValue.Int()
} else {
return false
}
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("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 { func BICValidator(fl validator.FieldLevel) bool {
fieldValue := fl.Field().String() fieldValue := fl.Field().String()