user.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package store
  2. import (
  3. "context"
  4. )
  5. // Role is the type of a role.
  6. type Role string
  7. const (
  8. // RoleHost is the HOST role.
  9. RoleHost Role = "HOST"
  10. // RoleAdmin is the ADMIN role.
  11. RoleAdmin Role = "ADMIN"
  12. // RoleUser is the USER role.
  13. RoleUser Role = "USER"
  14. )
  15. func (e Role) String() string {
  16. switch e {
  17. case RoleHost:
  18. return "HOST"
  19. case RoleAdmin:
  20. return "ADMIN"
  21. case RoleUser:
  22. return "USER"
  23. }
  24. return "USER"
  25. }
  26. const (
  27. SystemBotID int32 = 0
  28. )
  29. var (
  30. SystemBot = &User{
  31. ID: SystemBotID,
  32. Username: "system_bot",
  33. Role: RoleAdmin,
  34. Email: "",
  35. Nickname: "Bot",
  36. }
  37. )
  38. type User struct {
  39. ID int32
  40. // Standard fields
  41. RowStatus RowStatus
  42. CreatedTs int64
  43. UpdatedTs int64
  44. // Domain specific fields
  45. Username string
  46. Role Role
  47. Email string
  48. Nickname string
  49. PasswordHash string
  50. AvatarURL string
  51. Description string
  52. }
  53. type UpdateUser struct {
  54. ID int32
  55. UpdatedTs *int64
  56. RowStatus *RowStatus
  57. Username *string
  58. Role *Role
  59. Email *string
  60. Nickname *string
  61. Password *string
  62. AvatarURL *string
  63. PasswordHash *string
  64. Description *string
  65. }
  66. type FindUser struct {
  67. ID *int32
  68. RowStatus *RowStatus
  69. Username *string
  70. Role *Role
  71. Email *string
  72. Nickname *string
  73. // The maximum number of users to return.
  74. Limit *int
  75. }
  76. type DeleteUser struct {
  77. ID int32
  78. }
  79. func (s *Store) CreateUser(ctx context.Context, create *User) (*User, error) {
  80. user, err := s.driver.CreateUser(ctx, create)
  81. if err != nil {
  82. return nil, err
  83. }
  84. s.userCache.Store(user.ID, user)
  85. return user, nil
  86. }
  87. func (s *Store) UpdateUser(ctx context.Context, update *UpdateUser) (*User, error) {
  88. user, err := s.driver.UpdateUser(ctx, update)
  89. if err != nil {
  90. return nil, err
  91. }
  92. s.userCache.Store(user.ID, user)
  93. return user, nil
  94. }
  95. func (s *Store) ListUsers(ctx context.Context, find *FindUser) ([]*User, error) {
  96. list, err := s.driver.ListUsers(ctx, find)
  97. if err != nil {
  98. return nil, err
  99. }
  100. for _, user := range list {
  101. s.userCache.Store(user.ID, user)
  102. }
  103. return list, nil
  104. }
  105. func (s *Store) GetUser(ctx context.Context, find *FindUser) (*User, error) {
  106. if find.ID != nil {
  107. if *find.ID == SystemBotID {
  108. return SystemBot, nil
  109. }
  110. if cache, ok := s.userCache.Load(*find.ID); ok {
  111. user, ok := cache.(*User)
  112. if ok {
  113. return user, nil
  114. }
  115. }
  116. }
  117. list, err := s.ListUsers(ctx, find)
  118. if err != nil {
  119. return nil, err
  120. }
  121. if len(list) == 0 {
  122. return nil, nil
  123. }
  124. user := list[0]
  125. s.userCache.Store(user.ID, user)
  126. return user, nil
  127. }
  128. func (s *Store) DeleteUser(ctx context.Context, delete *DeleteUser) error {
  129. err := s.driver.DeleteUser(ctx, delete)
  130. if err != nil {
  131. return err
  132. }
  133. s.userCache.Delete(delete.ID)
  134. return nil
  135. }