aditya.siregar 3c80b710af Update Infra
2025-03-04 20:36:17 +07:00

181 lines
4.7 KiB
Go

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,
RoleID: role.Customer,
UserType: "CUSTOMER",
}
}