| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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(),
- })
- }
|