Kaynağa Gözat

I got to implement this shit

cesarssh.dev@gmail.com 1 yıl önce
ebeveyn
işleme
1f986d951e

+ 26 - 0
infoflags.txt

@@ -0,0 +1,26 @@
+NivelRico
+Bitshift: 1 << 0
+Valor binario: 00001
+Valor decimal: 1
+
+NivelPobre
+Bitshift: 1 << 1
+Valor binario: 00010
+Valor decimal: 2
+
+DescAfromex
+Bitshift: 1 << 2
+Valor binario: 00100
+Valor decimal: 4
+
+DescIndigena
+Bitshift: 1 << 3
+Valor binario: 01000
+Valor decimal: 8
+
+Neurodivergente
+Bitshift: 1 << 4
+Valor binario: 10000
+Valor decimal: 16
+
+Por ejemplo: Si es Rico, Con descendencia Afro e Indigena y es Neurodivergente: seria asi: 1 + 4 + 8 + 16 = 29 y este numero mandaria en el json

+ 7 - 1
internal/command/create_user_command.go

@@ -10,14 +10,16 @@ type CreateUserCommand struct {
 	LastName  string `json:"last_name"`
 	Sex       string `json:"sex"`
 	BirthDate string `json:"birth_date"`
+	Flags     int    `json:"flags"`
 }
 
-func NewCreateUserCommand(firstName, lastName, sex, birthDate string) *CreateUserCommand {
+func NewCreateUserCommand(firstName, lastName, sex, birthDate string, flags int) *CreateUserCommand {
 	return &CreateUserCommand{
 		FirstName: firstName,
 		LastName:  lastName,
 		Sex:       sex,
 		BirthDate: birthDate,
+		Flags:     flags,
 	}
 }
 
@@ -35,12 +37,16 @@ func (c *CreateUserCommand) Validate() error {
 	if c.Sex == "" {
 		return errors.New("your sex is required")
 	}
+	if c.Flags < 0 {
+		return errors.New("flags must be a non-negative value")
+	}
 	// Crear una instancia de User para utilizar la validacion del modelo
 	user := models.User{
 		FirstName: c.FirstName,
 		LastName:  c.LastName,
 		Sex:       c.Sex,
 		BirthDate: c.BirthDate,
+		Flags:     c.Flags,
 	}
 
 	// Validar el modelo User

+ 46 - 0
internal/models/user.go

@@ -1,12 +1,22 @@
 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
@@ -14,6 +24,7 @@ type User struct {
 	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
@@ -31,3 +42,38 @@ func (u *User) Validate() error {
 	})
 	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(),
+	})
+}

+ 1 - 0
internal/service/user_command_service.go

@@ -22,6 +22,7 @@ func (s *UserCommandService) CreateUser(cmd *command.CreateUserCommand) error {
 		LastName:  cmd.LastName,
 		Sex:       cmd.Sex,
 		BirthDate: cmd.BirthDate,
+		Flags:     cmd.Flags,
 	}
 	return s.userRepository.Create(user)
 }