81 lines
1.9 KiB
Go
Raw Permalink Normal View History

2024-11-07 19:07:41 +00:00
package models
2024-11-12 17:17:10 +00:00
import "slices"
2024-11-07 19:07:41 +00:00
const (
UserRoleUser = "user"
UserRoleAdmin = "admin"
2024-11-17 17:54:41 +07:00
UserAccountTypeGithub = "github"
2024-11-07 19:07:41 +00:00
)
type User struct {
2024-11-09 10:33:07 +00:00
Model
2024-11-07 19:07:41 +00:00
2024-11-17 19:49:42 +07:00
Name string `json:"name"`
Username *string `json:"username" gorm:"unique"`
Password string `json:"-"`
Email *string `json:"email" gorm:"unique"`
Role string `json:"role" gorm:"default:user;not null;index:users_role_idx;type:varchar(8)"`
Image string `json:"image" gorm:"type:varchar(255)"`
2024-11-07 19:07:41 +00:00
2024-11-17 17:54:41 +07:00
Teams []*TeamMembers `json:"teams" gorm:"foreignKey:UserID"`
Accounts []*UserAccount `json:"accounts" gorm:"foreignKey:UserID"`
2024-11-12 19:15:13 +07:00
2024-11-07 19:07:41 +00:00
Timestamps
SoftDeletes
}
type UserSession struct {
ID string `json:"id" gorm:"primarykey;type:varchar(40)"`
UserID string `json:"userId" gorm:"type:varchar(26)"`
User User `json:"user"`
Timestamps
SoftDeletes
}
2024-11-12 17:17:10 +00:00
2024-11-17 17:54:41 +07:00
type UserAccount struct {
Model
UserID string `json:"userId" gorm:"type:varchar(26)"`
User User `json:"user" gorm:"foreignKey:UserID"`
Type string `json:"type" gorm:"type:varchar(16);index:user_accounts_type_idx"`
AccountID string `json:"accountId" gorm:"type:varchar(64);index:user_accounts_accountid_idx"`
Username string `json:"username" gorm:"type:varchar(64);index:user_accounts_username_idx"`
Email string `json:"email" gorm:"type:varchar(64);index:user_accounts_email_idx"`
Timestamps
}
2024-11-12 17:17:10 +00:00
func (u *User) IsAdmin() bool {
return u.Role == UserRoleAdmin
}
func (u *User) GetTeamRole(teamId *string) string {
if u.IsAdmin() {
return TeamRoleAdmin
}
if teamId == nil {
return ""
}
idx := slices.IndexFunc(u.Teams, func(tm *TeamMembers) bool {
return tm.TeamID == *teamId
})
if idx == -1 {
return ""
}
return u.Teams[idx].Role
}
func (u *User) IsInTeam(teamId *string) bool {
role := u.GetTeamRole(teamId)
return role != ""
}
func (u *User) TeamCanWrite(teamId *string) bool {
role := u.GetTeamRole(teamId)
return role == TeamRoleAdmin || role == TeamRoleOwner
}