user.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package models
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. // Typed errors
  7. var (
  8. ErrUserNotFound = errors.New("User not found")
  9. ErrLastGrafanaAdmin = errors.New("Cannot remove last grafana admin")
  10. )
  11. type Password string
  12. func (p Password) IsWeak() bool {
  13. return len(p) <= 4
  14. }
  15. type User struct {
  16. Id int64
  17. Version int
  18. Email string
  19. Name string
  20. Login string
  21. Password string
  22. Salt string
  23. Rands string
  24. Company string
  25. EmailVerified bool
  26. Theme string
  27. HelpFlags1 HelpFlags1
  28. IsDisabled bool
  29. IsAdmin bool
  30. OrgId int64
  31. Created time.Time
  32. Updated time.Time
  33. LastSeenAt time.Time
  34. }
  35. func (u *User) NameOrFallback() string {
  36. if u.Name != "" {
  37. return u.Name
  38. } else if u.Login != "" {
  39. return u.Login
  40. } else {
  41. return u.Email
  42. }
  43. }
  44. // ---------------------
  45. // COMMANDS
  46. type CreateUserCommand struct {
  47. Email string
  48. Login string
  49. Name string
  50. Company string
  51. OrgName string
  52. Password string
  53. EmailVerified bool
  54. IsAdmin bool
  55. SkipOrgSetup bool
  56. DefaultOrgRole string
  57. Result User
  58. }
  59. type UpdateUserCommand struct {
  60. Name string `json:"name"`
  61. Email string `json:"email"`
  62. Login string `json:"login"`
  63. Theme string `json:"theme"`
  64. UserId int64 `json:"-"`
  65. }
  66. type ChangeUserPasswordCommand struct {
  67. OldPassword string `json:"oldPassword"`
  68. NewPassword string `json:"newPassword"`
  69. UserId int64 `json:"-"`
  70. }
  71. type UpdateUserPermissionsCommand struct {
  72. IsGrafanaAdmin bool
  73. UserId int64 `json:"-"`
  74. }
  75. type DisableUserCommand struct {
  76. UserId int64
  77. IsDisabled bool
  78. }
  79. type DeleteUserCommand struct {
  80. UserId int64
  81. }
  82. type SetUsingOrgCommand struct {
  83. UserId int64
  84. OrgId int64
  85. }
  86. // ----------------------
  87. // QUERIES
  88. type GetUserByLoginQuery struct {
  89. LoginOrEmail string
  90. Result *User
  91. }
  92. type GetUserByEmailQuery struct {
  93. Email string
  94. Result *User
  95. }
  96. type GetUserByIdQuery struct {
  97. Id int64
  98. Result *User
  99. }
  100. type GetSignedInUserQuery struct {
  101. UserId int64
  102. Login string
  103. Email string
  104. OrgId int64
  105. Result *SignedInUser
  106. }
  107. type GetUserProfileQuery struct {
  108. UserId int64
  109. Result UserProfileDTO
  110. }
  111. type SearchUsersQuery struct {
  112. OrgId int64
  113. Query string
  114. Page int
  115. Limit int
  116. Result SearchUserQueryResult
  117. }
  118. type SearchUserQueryResult struct {
  119. TotalCount int64 `json:"totalCount"`
  120. Users []*UserSearchHitDTO `json:"users"`
  121. Page int `json:"page"`
  122. PerPage int `json:"perPage"`
  123. }
  124. type GetUserOrgListQuery struct {
  125. UserId int64
  126. Result []*UserOrgDTO
  127. }
  128. // ------------------------
  129. // DTO & Projections
  130. type SignedInUser struct {
  131. UserId int64
  132. OrgId int64
  133. OrgName string
  134. OrgRole RoleType
  135. Login string
  136. Name string
  137. Email string
  138. ApiKeyId int64
  139. OrgCount int
  140. IsGrafanaAdmin bool
  141. IsAnonymous bool
  142. HelpFlags1 HelpFlags1
  143. LastSeenAt time.Time
  144. Teams []int64
  145. }
  146. func (u *SignedInUser) ShouldUpdateLastSeenAt() bool {
  147. return u.UserId > 0 && time.Since(u.LastSeenAt) > time.Minute*5
  148. }
  149. func (u *SignedInUser) NameOrFallback() string {
  150. if u.Name != "" {
  151. return u.Name
  152. } else if u.Login != "" {
  153. return u.Login
  154. } else {
  155. return u.Email
  156. }
  157. }
  158. type UpdateUserLastSeenAtCommand struct {
  159. UserId int64
  160. }
  161. func (user *SignedInUser) HasRole(role RoleType) bool {
  162. if user.IsGrafanaAdmin {
  163. return true
  164. }
  165. return user.OrgRole.Includes(role)
  166. }
  167. type UserProfileDTO struct {
  168. Id int64 `json:"id"`
  169. Email string `json:"email"`
  170. Name string `json:"name"`
  171. Login string `json:"login"`
  172. Theme string `json:"theme"`
  173. OrgId int64 `json:"orgId"`
  174. IsGrafanaAdmin bool `json:"isGrafanaAdmin"`
  175. IsDisabled bool `json:"isDisabled"`
  176. }
  177. type UserSearchHitDTO struct {
  178. Id int64 `json:"id"`
  179. Name string `json:"name"`
  180. Login string `json:"login"`
  181. Email string `json:"email"`
  182. AvatarUrl string `json:"avatarUrl"`
  183. IsAdmin bool `json:"isAdmin"`
  184. IsDisabled bool `json:"isDisabled"`
  185. LastSeenAt time.Time `json:"lastSeenAt"`
  186. LastSeenAtAge string `json:"lastSeenAtAge"`
  187. }
  188. type UserIdDTO struct {
  189. Id int64 `json:"id"`
  190. Message string `json:"message"`
  191. }