github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/entities/user.go (about) 1 package entities 2 3 import ( 4 "fmt" 5 "net/url" 6 "time" 7 8 "github.com/golang-jwt/jwt/v4" 9 "github.com/ngocphuongnb/tetua/app/config" 10 "github.com/ngocphuongnb/tetua/app/utils" 11 ) 12 13 // User is the model entity for the User schema. 14 type User struct { 15 ID int `json:"id,omitempty" form:"id"` 16 CreatedAt *time.Time `json:"created_at,omitempty" form:"created_at"` 17 UpdatedAt *time.Time `json:"updated_at,omitempty" form:"updated_at"` 18 DeletedAt *time.Time `json:"deleted_at,omitempty" form:"deleted_at"` 19 Username string `json:"username,omitempty" form:"username"` 20 DisplayName string `json:"display_name,omitempty" form:"display_name"` 21 URL string `json:"url,omitempty" form:"url"` 22 Provider string `json:"provider,omitempty" form:"provider"` 23 ProviderID string `json:"provider_id,omitempty" form:"provider_id"` 24 ProviderUsername string `json:"provider_username,omitempty" form:"provider_username"` 25 ProviderAvatar string `json:"provider_avatar,omitempty" form:"provider_avatar"` 26 Email string `json:"email,omitempty" form:"email"` 27 Password string `json:"password,omitempty" form:"password"` 28 Bio string `json:"bio,omitempty" form:"bio"` 29 BioHTML string `json:"bio_html,omitempty" form:"bio_html"` 30 RoleIDs []int `json:"role_ids,omitempty" form:"role_ids"` 31 Roles []*Role `json:"roles,omitempty" form:"roles"` 32 Active bool `json:"active,omitempty" form:"active"` 33 AvatarImage *File `json:"avatar_image,omitempty" form:"avatar_image"` 34 AvatarImageID int `json:"avatar_image_id,omitempty" form:"avatar_image_id"` 35 AvatarImageUrl string `json:"avatar_image_url,omitempty" form:"avatar_image_url"` 36 } 37 38 type UserMutation struct { 39 Username string `json:"username,omitempty" form:"username"` 40 DisplayName string `json:"display_name,omitempty" form:"display_name"` 41 URL string `json:"url,omitempty" form:"url"` 42 Provider string `json:"provider,omitempty" form:"provider"` 43 ProviderID string `json:"provider_id,omitempty" form:"provider_id"` 44 ProviderUsername string `json:"provider_username,omitempty" form:"provider_username"` 45 ProviderAvatar string `json:"provider_avatar,omitempty" form:"provider_avatar"` 46 Email string `json:"email,omitempty" form:"email"` 47 Password string `json:"password,omitempty" form:"password"` 48 Bio string `json:"bio,omitempty" form:"bio"` 49 RoleIDs []int `json:"role_ids,omitempty" form:"role_ids"` 50 Active bool `json:"active,omitempty" form:"active"` 51 } 52 53 type SettingMutation struct { 54 Username string `json:"username,omitempty" form:"username"` 55 DisplayName string `json:"display_name,omitempty" form:"display_name"` 56 URL string `json:"url,omitempty" form:"url"` 57 Email string `json:"email,omitempty" form:"email"` 58 Password string `json:"password,omitempty" form:"password"` 59 Bio string `json:"bio,omitempty" form:"bio"` 60 BioHTML string `json:"bio_html,omitempty" form:"bio_html"` 61 AvatarImageID int `json:"avatar_image_id,omitempty" form:"avatar_image_id"` 62 } 63 64 type UserJwtClaims struct { 65 jwt.RegisteredClaims 66 User User `json:"user"` 67 } 68 69 type UserFilter struct { 70 *Filter 71 } 72 73 func (u *User) JwtClaim(exp time.Time, jwtHeaders ...map[string]interface{}) (string, error) { 74 u.RoleIDs = make([]int, 0) 75 76 for _, role := range u.Roles { 77 if role.ID > 0 { 78 u.RoleIDs = append(u.RoleIDs, role.ID) 79 } 80 } 81 82 user := User{ 83 ID: u.ID, 84 Provider: u.Provider, 85 Username: u.Username, 86 Email: u.Email, 87 DisplayName: u.DisplayName, 88 Active: u.Active, 89 RoleIDs: u.RoleIDs, 90 AvatarImageUrl: u.Avatar(), 91 } 92 93 claims := &UserJwtClaims{ 94 RegisteredClaims: jwt.RegisteredClaims{ 95 Issuer: config.Setting("app_name"), 96 ExpiresAt: &jwt.NumericDate{Time: exp}, 97 }, 98 User: user, 99 } 100 101 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) 102 103 if len(jwtHeaders) > 0 { 104 for k, v := range jwtHeaders[0] { 105 token.Header[k] = v 106 } 107 } 108 109 return token.SignedString([]byte(config.APP_KEY)) 110 } 111 112 func (u *User) IsRoot() bool { 113 if u == nil { 114 return false 115 } 116 if u.Roles == nil { 117 return false 118 } 119 for _, role := range u.Roles { 120 if role.Root { 121 return true 122 } 123 } 124 125 return false 126 } 127 128 func (u *User) Name() string { 129 if u == nil { 130 return "" 131 } 132 if u.DisplayName != "" { 133 return u.DisplayName 134 } 135 136 return u.Username 137 } 138 func (u *User) Url() string { 139 if u == nil { 140 return "" 141 } 142 return utils.Url("/u/" + u.Username) 143 } 144 145 func (u *User) Avatar() string { 146 if u == nil { 147 return "" 148 } 149 if u.AvatarImage != nil && u.AvatarImage.ID > 0 { 150 return u.AvatarImage.Url() 151 } 152 153 if u.ProviderAvatar != "" { 154 return u.ProviderAvatar 155 } 156 157 return u.AvatarImageUrl 158 } 159 160 func (u *User) AvatarElm(width, height string, disableLink bool) string { 161 var userAvatar = u.Avatar() 162 if userAvatar != "" { 163 if !disableLink { 164 return fmt.Sprintf( 165 `<a class="avatar" href="%s" title="%s" target="_blank"><img src="%s" width="%s" height="%s" alt="%s" /></a>`, 166 u.Url(), 167 u.Name(), 168 userAvatar, 169 width, 170 height, 171 u.Name(), 172 ) 173 } else { 174 return fmt.Sprintf( 175 `<img src="%s" width="%s" height="%s" alt="%s" />`, 176 userAvatar, 177 width, 178 height, 179 u.Name(), 180 ) 181 } 182 } 183 184 return `<span class="avatar none"></span>` 185 } 186 187 func (p *UserFilter) Base() string { 188 q := url.Values{} 189 if p.Search != "" { 190 q.Add("q", p.Search) 191 } 192 if queryString := q.Encode(); queryString != "" { 193 return p.FilterBaseUrl() + "?" + q.Encode() 194 } 195 196 return p.FilterBaseUrl() 197 }