2025-05-06 15:21:12 +07:00

144 lines
3.2 KiB
Go

package entity
import (
"enaklo-pos-be/internal/constants/role"
"enaklo-pos-be/internal/constants/userstatus"
"errors"
"time"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID int64
Name string
Email string
Password string
Status userstatus.UserStatus
NIK string
UserType string
CreatedAt time.Time
UpdatedAt time.Time
RoleID role.Role
PhoneNumber string
RoleName string
PartnerID *int64
SiteID *int64
SiteName string
PartnerName string
ResetPassword bool
}
type Customer struct {
ID int64
Name string
Email string
Password string
Phone string
Points int
Status userstatus.UserStatus
NIK string
UserType string
CreatedAt time.Time
UpdatedAt time.Time
RoleID role.Role
PhoneNumber string
RoleName string
PartnerID *int64
SiteID *int64
SiteName string
PartnerName string
ResetPassword bool
CustomerID string
BirthDate time.Time
VerificationID string
OTP string
}
type CustomerPoints struct {
ID uint64
CustomerID uint64
TotalPoints int
AvailablePoints int
}
type AuthenticateUser struct {
ID int64
Token string
Name string
RoleID role.Role
RoleName string
PartnerID *int64
PartnerName string
PartnerStatus string
SiteID *int64
SiteName string
ResetPassword bool
PartnerLicense PartnerLicense
UserType string
}
type UserRoleDB struct {
ID int64 `gorm:"primary_key;column:user_role_id" `
UserID int64 `gorm:"column:user_id"`
RoleID int64 `gorm:"column:role_id"`
PartnerID *int64 `gorm:"column:partner_id"`
SiteID *int64 `gorm:"column:site_id"`
CreatedAt time.Time `gorm:"column:created_at"`
UpdatedAt time.Time `gorm:"column:updated_at"`
}
func (UserRoleDB) TableName() string {
return "user_roles"
}
func (u *User) ToUserDB(createdBy int64) (*UserDB, error) {
hashedPassword, err := u.HashedPassword(u.Password)
if err != nil {
return nil, err
}
if u.RoleID == role.Admin && u.PartnerID == nil {
return nil, errors.New("invalid request")
}
return &UserDB{
Name: u.Name,
Email: u.Email,
Password: hashedPassword,
RoleID: int64(u.RoleID),
PartnerID: u.PartnerID,
Status: userstatus.Active,
CreatedBy: createdBy,
SiteID: u.SiteID,
PhoneNumber: u.PhoneNumber,
NIK: u.NIK,
UserType: u.UserType,
}, nil
}
func (u User) HashedPassword(password string) (string, error) {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), nil
}
func (c Customer) HashedPassword() string {
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(c.Password), bcrypt.DefaultCost)
return string(hashedPassword)
}
func (u *Customer) ToUserAuthenticate(signedToken string) *AuthenticateUser {
return &AuthenticateUser{
ID: u.ID,
Token: signedToken,
Name: u.Name,
UserType: u.UserType,
}
}