package models import ( "encoding/json" "regexp" "github.com/go-playground/validator/v10" "gorm.io/gorm" ) // Definir las banderas usando operadores bitwise const ( NivelRico = 1 << 0 // 00001 NivelPobre = 1 << 1 // 00010 DescAfromex = 1 << 2 // 00100 DescIndigena = 1 << 3 // 01000 Neurodivergente = 1 << 4 // 10000 ) // User struct with validation tags type User struct { gorm.Model FirstName string `json:"first_name" validate:"required,min=2,max=40,uppercase"` LastName string `json:"last_name" validate:"required,min=2,max=40,uppercase"` Sex string `json:"sex" validate:"required,oneof=H M"` BirthDate string `json:"birth_date" validate:"required,birthdate"` //dd-mm-yyyy Flags int `json:"flags" validate:"required"` } // Validate validates the User struct func (u *User) Validate() error { validate := validator.New() // Custom validation for BirthDate validate.RegisterValidation("birthdate", func(fl validator.FieldLevel) bool { re := regexp.MustCompile(`^(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])-\d{4}$`) return re.MatchString(fl.Field().String()) }) // Custom validation for Uppercase validate.RegisterValidation("uppercase", func(fl validator.FieldLevel) bool { re := regexp.MustCompile(`^[A-Z]+$`) // Permite solo letras mayúsculas return re.MatchString(fl.Field().String()) }) return validate.Struct(u) } // Función para establecer banderas func (u *User) SetFlags(flags ...int) { for _, flag := range flags { u.Flags |= flag // Usa OR bitwise para agregar la bandera } } // Función para verificar si una bandera está activa func (u *User) HasFlag(flag int) bool { return u.Flags&flag != 0 // Usa AND bitwise para comprobar la bandera } // Método para obtener una representación JSON amigable de las banderas func (u *User) GetFlags() map[string]bool { return map[string]bool{ "NivelRico": u.HasFlag(NivelRico), "NivelPobre": u.HasFlag(NivelPobre), "DescAfromex": u.HasFlag(DescAfromex), "DescIndigena": u.HasFlag(DescIndigena), "Neurodivergente": u.HasFlag(Neurodivergente), } } // Custom MarshalJSON to include flag details func (u *User) MarshalJSON() ([]byte, error) { type Alias User return json.Marshal(&struct { *Alias FlagsDetails map[string]bool `json:"flags_details"` }{ Alias: (*Alias)(u), FlagsDetails: u.GetFlags(), }) }