You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

user.go 3.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package mq
  2. import (
  3. "errors"
  4. "fmt"
  5. "gitlink.org.cn/cloudream/common/consts/errorcode"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/common/pkgs/mq"
  8. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/db2"
  10. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  11. "gorm.io/gorm"
  12. )
  13. func (svc *Service) CreateUser(msg *coormq.CreateUser) (*coormq.CreateUserResp, *mq.CodeMessage) {
  14. var user cdssdk.User
  15. err := svc.db2.DoTx(func(tx db2.SQLContext) error {
  16. var err error
  17. user, err = svc.db2.User().Create(tx, msg.Name)
  18. if err != nil {
  19. return fmt.Errorf("creating user: %w", err)
  20. }
  21. // TODO 目前新建用户的权限与ID 1的相同
  22. hubs, err := svc.db2.UserHub().GetByUserID(tx, 1)
  23. if err != nil {
  24. return fmt.Errorf("getting user hubs: %w", err)
  25. }
  26. stgs, err := svc.db2.UserStorage().GetByUserID(tx, 1)
  27. if err != nil {
  28. return fmt.Errorf("getting user storages: %w", err)
  29. }
  30. for _, hub := range hubs {
  31. err := svc.db2.UserHub().Create(tx, user.UserID, hub.HubID)
  32. if err != nil {
  33. return fmt.Errorf("creating user hub: %w", err)
  34. }
  35. }
  36. for _, stg := range stgs {
  37. err := svc.db2.UserStorage().Create(tx, user.UserID, stg.StorageID)
  38. if err != nil {
  39. return fmt.Errorf("creating user storage: %w", err)
  40. }
  41. }
  42. return nil
  43. })
  44. if err != nil {
  45. logger.WithField("Name", msg.Name).
  46. Warn(err.Error())
  47. if errors.Is(err, gorm.ErrDuplicatedKey) {
  48. return nil, mq.Failed(errorcode.DataExists, "user name already exists")
  49. }
  50. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  51. }
  52. return mq.ReplyOK(coormq.RespCreateUser(user))
  53. }
  54. func (svc *Service) DeleteUser(msg *coormq.DeleteUser) (*coormq.DeleteUserResp, *mq.CodeMessage) {
  55. // TODO 目前不能删除ID 1的用户
  56. if msg.UserID == 1 {
  57. return nil, mq.Failed(errorcode.OperationFailed, "cannot delete the default user")
  58. }
  59. err := svc.db2.DoTx(func(tx db2.SQLContext) error {
  60. err := svc.db2.User().Delete(tx, msg.UserID)
  61. if err != nil {
  62. return fmt.Errorf("deleting user: %w", err)
  63. }
  64. err = svc.db2.UserHub().DeleteByUserID(tx, msg.UserID)
  65. if err != nil {
  66. return fmt.Errorf("deleting user hubs: %w", err)
  67. }
  68. err = svc.db2.UserStorage().DeleteByUserID(tx, msg.UserID)
  69. if err != nil {
  70. return fmt.Errorf("deleting user storages: %w", err)
  71. }
  72. bkts, err := svc.db2.UserBucket().GetByUserID(tx, msg.UserID)
  73. if err != nil {
  74. return fmt.Errorf("getting user buckets: %w", err)
  75. }
  76. for _, bkt := range bkts {
  77. pkgs, err := svc.db2.Package().GetBucketPackages(tx, bkt.BucketID)
  78. if err != nil {
  79. return fmt.Errorf("getting bucket packages: %w", err)
  80. }
  81. for _, pkg := range pkgs {
  82. err := svc.db2.Package().DeleteComplete(tx, pkg.PackageID)
  83. if err != nil {
  84. return fmt.Errorf("deleting package %v: %w", pkg.PackageID, err)
  85. }
  86. }
  87. err = svc.db2.Bucket().Delete(tx, bkt.BucketID)
  88. if err != nil {
  89. return fmt.Errorf("deleting bucket: %w", err)
  90. }
  91. }
  92. err = svc.db2.UserBucket().DeleteByUserID(tx, msg.UserID)
  93. if err != nil {
  94. return fmt.Errorf("deleting user buckets: %w", err)
  95. }
  96. return nil
  97. })
  98. if err != nil {
  99. logger.WithField("UserID", msg.UserID).
  100. Warn(err.Error())
  101. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  102. }
  103. return mq.ReplyOK(coormq.RespDeleteUser())
  104. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。