leaf-library-3/internal/dto/user/user.go
2024-12-10 18:22:14 +08:00

118 lines
2.2 KiB
Go

package user
import (
"slices"
"time"
)
// AnonymousUser 调试模式下的用户
const AnonymousUser ID = "anonymous"
type Token struct {
Aud string `json:"aud"`
Iss string `json:"iss"`
Iat float64 `json:"iat"`
Exp float64 `json:"exp"`
Sub ID `json:"sub" mapstructure:"-"`
Scopes []string `json:"scopes"`
Roles []Role `json:"roles,omitempty"`
Permissions []Permission `json:"permissions"`
Uuid string `json:"uuid"`
Avatar string `json:"avatar"`
Name string `json:"name"`
EmailVerified bool `json:"email_verified"`
RealNameVerified bool `json:"real_name_verified"`
PhoneVerified bool `json:"phone_verified"`
Email string `json:"email"`
Phone string `json:"phone"`
CreatedAt time.Time `json:"created_at"`
}
type User struct {
Token Token
ID ID
Valid bool
}
type Role string
func (r Role) String() string {
return string(r)
}
type Permission string
type ID string
func (u *User) GetId() ID {
return u.Token.Sub
}
func (u *User) GetName() string {
return u.Token.Name
}
func (u *User) GetEmail() string {
return u.Token.Email
}
func (u *User) GetPhone() string {
return u.Token.Phone
}
func (u *User) GetRoles() []Role {
return u.Token.Roles
}
func (u *User) GetPermissions() []Permission {
return u.Token.Permissions
}
func (u *User) GetAvatar() string {
return u.Token.Avatar
}
func (u *User) GetUuid() string {
return u.Token.Uuid
}
func (u *User) HasRoles(roles ...Role) bool {
if len(roles) == 0 {
return true
}
for _, role := range roles {
pass := slices.Contains(u.Token.Roles, role)
if !pass {
return false
}
}
return true
}
func (u *User) HasPermissions(permissions ...Permission) bool {
if len(permissions) == 0 {
return true
}
for _, p := range permissions {
pass := slices.Contains(u.Token.Permissions, p)
if !pass {
return false
}
}
return true
}
func (u ID) String() string {
return string(u)
}
func (up Permission) String() string {
return string(up)
}