admin_user.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package repository
  2. import (
  3. "github.com/pkg/errors"
  4. "gorm.io/gorm"
  5. "sghgogs.com/sghblog/authorization-service/domain/model/base"
  6. req "sghgogs.com/sghblog/authorization-service/domain/model/request"
  7. pb "sghgogs.com/sghblog/authorization-service/proto"
  8. )
  9. func (u *Repository) GetAdminUser(userId int64) (req.AdminUser, error) {
  10. var user req.AdminUser
  11. return user, u.db.Where("id = ? ", userId).
  12. Preload("Roles", "status = ?", pb.StatusEnum_ENABLED).
  13. Preload("Teams", "status = ?", pb.StatusEnum_ENABLED).
  14. First(&user).Error
  15. }
  16. func (u *Repository) GetAdminUserFind(name string) (req.AdminUser, error) {
  17. var user req.AdminUser
  18. return user, u.db.Where("username = ?", name).First(&user).Error
  19. }
  20. func (u *Repository) RetrieveEnabledUsers() ([]req.AdminUser, error) {
  21. users := make([]req.AdminUser, 0)
  22. return users, u.db.Model(req.AdminUser{}).
  23. Order("id desc").
  24. Select("ID", "Username").
  25. Where("status = ?", pb.StatusEnum_ENABLED).
  26. Find(&users).Error
  27. }
  28. func (u *Repository) ListAdminUsers(query *pb.ListAdminUsersRequest) ([]req.AdminUser, int64, error) {
  29. var totalCount int64
  30. tx := u.db.Model(&req.AdminUser{}).Order("id desc").
  31. Preload("Roles", "status = ?", pb.StatusEnum_ENABLED).
  32. Preload("Teams", "status = ?", pb.StatusEnum_ENABLED)
  33. if query.Keyword != "" {
  34. tx.Where("username = ? OR phone_number = ?", query.Keyword, query.Keyword)
  35. }
  36. if base.IsStatusEnum(query.Status) {
  37. tx.Where("status = ?", query.Status)
  38. }
  39. tx.Count(&totalCount)
  40. users := make([]req.AdminUser, 0)
  41. return users, totalCount, tx.Limit(int(query.PageSize)).Offset(int((query.Page - 1) * query.PageSize)).Find(&users).Error
  42. }
  43. func (u *Repository) CreateAdminUser(user *req.AdminUser, adminRoles []int64, adminTeams []int64) error {
  44. // 开始事务
  45. tx := u.db.Begin()
  46. // 错误处理
  47. defer func() {
  48. if r := recover(); r != nil {
  49. tx.Rollback()
  50. }
  51. }()
  52. if err := tx.Create(&user).Error; err != nil {
  53. tx.Rollback()
  54. return err
  55. }
  56. // 角色关联
  57. if len(adminRoles) > 0 {
  58. if _, err := u.getAdminRoleValidIDs(adminRoles); err != nil {
  59. tx.Rollback()
  60. return err
  61. }
  62. roles := make([]req.AdminRole, 0)
  63. for _, ID := range adminRoles {
  64. roles = append(roles, req.AdminRole{ID: ID})
  65. }
  66. if err := tx.Model(&user).Association("Roles").Append(&roles); err != nil {
  67. tx.Rollback()
  68. return err
  69. }
  70. }
  71. if len(adminTeams) > 0 {
  72. if _, err := u.getAdminTeamValidIDs(adminTeams); err != nil {
  73. tx.Rollback()
  74. return err
  75. }
  76. teams := make([]req.AdminTeam, 0)
  77. for _, ID := range adminTeams {
  78. teams = append(teams, req.AdminTeam{ID: ID})
  79. }
  80. if err := tx.Model(&user).Association("Teams").Append(&teams); err != nil {
  81. tx.Rollback()
  82. return err
  83. }
  84. }
  85. return tx.Commit().Error
  86. }
  87. func (u *Repository) IsAdminUserExists(identifier interface{}) (bool, error) {
  88. var user req.AdminUser
  89. if err := u.db.Where("id = ? OR username = ?", identifier, identifier).First(&user).Error; err != nil {
  90. if errors.Is(err, gorm.ErrRecordNotFound) {
  91. return false, nil // 记录不存在,账号不存在
  92. }
  93. return false, err // 发生其他错误
  94. }
  95. return true, nil
  96. }
  97. func (u *Repository) UpdateAdminUser(updateUser *pb.UpdateAdminUserRequest) error {
  98. // updateUser.
  99. // 1. 开启事务
  100. tx := u.db.Begin()
  101. // 错误处理
  102. defer func() {
  103. if r := recover(); r != nil {
  104. tx.Rollback()
  105. }
  106. }()
  107. var user req.AdminUser
  108. // 1.查询角色
  109. if err := tx.First(&user, updateUser.Id).Error; err != nil {
  110. tx.Rollback()
  111. return err
  112. }
  113. if err := tx.Model(&user).Association("Teams").Clear(); err != nil {
  114. tx.Rollback()
  115. return err
  116. }
  117. if len(updateUser.Teams) > 0 {
  118. if _, err := u.getAdminTeamValidIDs(updateUser.Teams); err != nil {
  119. tx.Rollback()
  120. return err
  121. }
  122. teams := make([]req.AdminTeam, 0)
  123. for _, ID := range updateUser.Teams {
  124. teams = append(teams, req.AdminTeam{
  125. ID: ID,
  126. })
  127. }
  128. if err := tx.Model(&user).Association("Teams").Append(&teams); err != nil {
  129. tx.Rollback()
  130. return err
  131. }
  132. }
  133. if err := tx.Model(&user).Association("Roles").Clear(); err != nil {
  134. tx.Rollback()
  135. return err
  136. }
  137. if len(updateUser.Roles) > 0 {
  138. if _, err := u.getAdminRoleValidIDs(updateUser.Roles); err != nil {
  139. tx.Rollback()
  140. return err
  141. }
  142. // 移除关联
  143. roles := make([]req.AdminRole, 0)
  144. for _, ID := range updateUser.Roles {
  145. roles = append(roles, req.AdminRole{
  146. ID: ID,
  147. })
  148. }
  149. // 重新关联
  150. if err := tx.Model(&user).Association("Roles").Append(&roles); err != nil {
  151. tx.Rollback()
  152. return err
  153. }
  154. }
  155. if err := tx.Model(&user).Updates(map[string]interface{}{
  156. "phone_number": updateUser.PhoneNumber,
  157. "email": updateUser.Email,
  158. "avatar": updateUser.Avatar,
  159. }).Error; err != nil {
  160. tx.Rollback()
  161. return err
  162. }
  163. return tx.Commit().Error
  164. }
  165. func (u *Repository) DeleteAdminUser(userId int64) error {
  166. // 1. 开启事务
  167. tx := u.db.Begin()
  168. // 错误处理
  169. defer func() {
  170. if r := recover(); r != nil {
  171. tx.Rollback()
  172. }
  173. }()
  174. var user req.AdminUser
  175. // 1.查询角色
  176. if err := tx.First(&user, userId).Error; err != nil {
  177. tx.Rollback()
  178. return err
  179. }
  180. if err := tx.Model(&user).Association("Roles").Clear(); err != nil {
  181. tx.Rollback()
  182. return err
  183. }
  184. // 1.2移除关联团队
  185. if err := tx.Model(&user).Association("Teams").Clear(); err != nil {
  186. tx.Rollback()
  187. return err
  188. }
  189. if err := tx.Model(&req.AdminUser{}).Delete(&req.AdminUser{
  190. ID: userId,
  191. }).Error; err != nil {
  192. tx.Rollback()
  193. return err
  194. }
  195. return tx.Commit().Error
  196. }
  197. func (u *Repository) ToggleAdminUser(adminUser *pb.ToggleAdminUserRequest) error {
  198. // 1. 开启事务
  199. tx := u.db.Begin()
  200. // 错误处理
  201. defer func() {
  202. if r := recover(); r != nil {
  203. tx.Rollback()
  204. }
  205. }()
  206. var user req.AdminUser
  207. // 1.查询角色
  208. if err := tx.First(&user, adminUser.UserId).Error; err != nil {
  209. tx.Rollback()
  210. return err
  211. }
  212. if adminUser.Status == pb.StatusEnum_DELETED {
  213. // 1.1删除关联角色
  214. if err := tx.Model(&user).Association("Roles").Clear(); err != nil {
  215. tx.Rollback()
  216. return err
  217. }
  218. // 1.2移除关联团队
  219. if err := tx.Model(&user).Association("Teams").Clear(); err != nil {
  220. tx.Rollback()
  221. return err
  222. }
  223. }
  224. // enum
  225. // 2. 更新状态
  226. if err := tx.Model(&req.AdminUser{}).Where("id = ?", adminUser.UserId).Updates(map[string]interface{}{
  227. "status": adminUser.Status,
  228. }).Error; err != nil {
  229. tx.Rollback()
  230. return err
  231. }
  232. return tx.Commit().Error
  233. }