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  }