package request import ( "enaklo-pos-be/internal/common/mycontext" "enaklo-pos-be/internal/constants/role" "enaklo-pos-be/internal/entity" "math/rand" "strings" "time" "github.com/go-playground/validator/v10" ) type User struct { Name string `json:"name" validate:"required"` Email string `json:"email" validate:"required,email"` Password string `json:"password"` PartnerID *int64 `json:"partner_id"` SiteID *int64 `json:"site_id"` RoleID role.Role `json:"role_id" validate:"required"` NIK string `json:"nik"` UserType string `json:"user_type"` PhoneNumber string `json:"phone_number"` } func (e *User) Validate() error { validate := validator.New() if err := validate.Struct(e); err != nil { return err } return nil } func RandomEmail() string { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" const length = 8 seededRand := rand.New(rand.NewSource(time.Now().UnixNano())) randomString := make([]byte, length) for i := range randomString { randomString[i] = charset[seededRand.Intn(len(charset))] } return string(randomString) + "@example.com" } func (u *User) ToEntity(ctx mycontext.Context, userType string) *entity.User { if !ctx.IsAdmin() { u.PartnerID = ctx.GetPartnerID() } if u.Email == "" { u.Email = RandomEmail() } return &entity.User{ Name: u.Name, Email: strings.ToLower(u.Email), Password: u.Password, RoleID: role.Role(u.RoleID), PartnerID: u.PartnerID, SiteID: u.SiteID, NIK: u.NIK, UserType: userType, PhoneNumber: u.PhoneNumber, } } type Customer struct { Name string `json:"name" binding:"required"` Email string `json:"email" binding:"required,email"` PhoneNumber string `json:"phone_number" binding:"required"` RoleID int64 `json:"role_id" binding:"required"` SiteID *int64 `json:"site_id" binding:"required"` } func (c *Customer) ToEntity(ctx mycontext.Context, userType string) entity.Customer { return entity.Customer{ Name: c.Name, Email: c.Email, PhoneNumber: c.PhoneNumber, SiteID: c.SiteID, PartnerID: ctx.GetPartnerID(), } } type UserParam struct { Search string `form:"search" json:"search" example:"admin,branch1"` Name string `form:"name" json:"name" example:"Admin 1"` RoleID int64 `form:"role_id" json:"role_id" example:"1"` PartnerID int64 `form:"partner_id" json:"partner_id" example:"1"` SiteID int64 `form:"site_id" json:"site_id" example:"1"` Limit int `form:"limit,default=10" json:"limit" example:"10"` Offset int `form:"offset,default=0" json:"offset" example:"0"` } func (p *UserParam) ToEntity(ctx mycontext.Context) entity.UserSearch { partnerID := p.PartnerID siteID := p.SiteID if !ctx.IsAdmin() { partnerID = *ctx.GetPartnerID() } if ctx.GetSiteID() != nil { siteID = *ctx.GetSiteID() } return entity.UserSearch{ Search: p.Search, Name: p.Name, RoleID: p.RoleID, PartnerID: partnerID, SiteID: siteID, Limit: p.Limit, Offset: p.Offset, } } type CustomerParam struct { Search string `form:"search" json:"search" example:"admin,branch1"` Name string `form:"name" json:"name" example:"Admin 1"` RoleID int64 `form:"role_id" json:"role_id" example:"1"` PartnerID int64 `form:"partner_id" json:"partner_id" example:"1"` SiteID int64 `form:"site_id" json:"site_id" example:"1"` Limit int `form:"limit,default=10" json:"limit" example:"10"` Offset int `form:"offset,default=0" json:"offset" example:"0"` } func (p *CustomerParam) ToEntity(ctx mycontext.Context) entity.CustomerSearch { partnerID := p.PartnerID siteID := p.SiteID if !ctx.IsAdmin() { partnerID = *ctx.GetPartnerID() } if ctx.GetSiteID() != nil { siteID = *ctx.GetSiteID() } return entity.CustomerSearch{ Search: p.Search, Name: p.Name, RoleID: p.RoleID, PartnerID: partnerID, SiteID: siteID, Limit: p.Limit, Offset: p.Offset, } } type UserRegister struct { Name string `json:"name" validate:"required" binding:"required"` Email string `json:"email" validate:"required" binding:"required"` PhoneNumber string `json:"phone_number" validate:"required" binding:"required"` Password string `json:"password" validate:"required" binding:"required"` } func (e *UserRegister) Validate() error { validate := validator.New() if err := validate.Struct(e); err != nil { return err } return nil } func (u *UserRegister) ToEntity() *entity.User { return &entity.User{ Name: u.Name, Email: strings.ToLower(u.Email), PhoneNumber: u.PhoneNumber, Password: u.Password, } }