user.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package models
  2. import (
  3. "encoding/json"
  4. "regexp"
  5. "github.com/go-playground/validator/v10"
  6. "gorm.io/gorm"
  7. )
  8. // Definir las banderas usando operadores bitwise
  9. const (
  10. NivelRico = 1 << 0 // 00001
  11. NivelPobre = 1 << 1 // 00010
  12. DescAfromex = 1 << 2 // 00100
  13. DescIndigena = 1 << 3 // 01000
  14. Neurodivergente = 1 << 4 // 10000
  15. )
  16. // User struct with validation tags
  17. type User struct {
  18. gorm.Model
  19. FirstName string `json:"first_name" validate:"required,min=2,max=40,uppercase"`
  20. LastName string `json:"last_name" validate:"required,min=2,max=40,uppercase"`
  21. Sex string `json:"sex" validate:"required,oneof=H M"`
  22. BirthDate string `json:"birth_date" validate:"required,birthdate"` //dd-mm-yyyy
  23. Flags int `json:"flags" validate:"required"`
  24. }
  25. // Validate validates the User struct
  26. func (u *User) Validate() error {
  27. validate := validator.New()
  28. // Custom validation for BirthDate
  29. validate.RegisterValidation("birthdate", func(fl validator.FieldLevel) bool {
  30. re := regexp.MustCompile(`^(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])-\d{4}$`)
  31. return re.MatchString(fl.Field().String())
  32. })
  33. // Custom validation for Uppercase
  34. validate.RegisterValidation("uppercase", func(fl validator.FieldLevel) bool {
  35. re := regexp.MustCompile(`^[A-Z]+$`) // Permite solo letras mayúsculas
  36. return re.MatchString(fl.Field().String())
  37. })
  38. return validate.Struct(u)
  39. }
  40. // Función para establecer banderas
  41. func (u *User) SetFlags(flags ...int) {
  42. for _, flag := range flags {
  43. u.Flags |= flag // Usa OR bitwise para agregar la bandera
  44. }
  45. }
  46. // Función para verificar si una bandera está activa
  47. func (u *User) HasFlag(flag int) bool {
  48. return u.Flags&flag != 0 // Usa AND bitwise para comprobar la bandera
  49. }
  50. // Método para obtener una representación JSON amigable de las banderas
  51. func (u *User) GetFlags() map[string]bool {
  52. return map[string]bool{
  53. "NivelRico": u.HasFlag(NivelRico),
  54. "NivelPobre": u.HasFlag(NivelPobre),
  55. "DescAfromex": u.HasFlag(DescAfromex),
  56. "DescIndigena": u.HasFlag(DescIndigena),
  57. "Neurodivergente": u.HasFlag(Neurodivergente),
  58. }
  59. }
  60. // Custom MarshalJSON to include flag details
  61. func (u *User) MarshalJSON() ([]byte, error) {
  62. type Alias User
  63. return json.Marshal(&struct {
  64. *Alias
  65. FlagsDetails map[string]bool `json:"flags_details"`
  66. }{
  67. Alias: (*Alias)(u),
  68. FlagsDetails: u.GetFlags(),
  69. })
  70. }