userInfoRepo.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package mongo
  2. import (
  3. "context"
  4. "fwh-toolbox-server/database"
  5. "fwh-toolbox-server/domain"
  6. "time"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "go.mongodb.org/mongo-driver/mongo"
  9. "go.mongodb.org/mongo-driver/mongo/options"
  10. )
  11. const (
  12. CollectionName_UserInfo = "UserInfo"
  13. )
  14. // 创建新数据的结构体配置(文档不存在,插入新文档时使用)
  15. func createUserInfoNewStruct(name string) bson.M {
  16. return bson.M{
  17. "_id": name,
  18. "info": domain.UserBaseInfoDomain{},
  19. "config": domain.UserConfigDomain{},
  20. }
  21. }
  22. // 读取指定用户的完整配置
  23. func UserInfoReadAllConfig(name string) (*domain.UserConfigDomain, error) {
  24. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  25. defer cancel()
  26. collection := database.GetCollection(CollectionName_UserInfo)
  27. filter := bson.M{"_id": name}
  28. // 只取 config 字段
  29. projection := bson.M{"config": 1}
  30. var config domain.UserConfigDomain
  31. err := collection.FindOne(ctx, filter, options.FindOne().SetProjection(projection)).Decode(&config)
  32. if err != nil {
  33. if err == mongo.ErrNoDocuments {
  34. // 未找到数据
  35. return &domain.UserConfigDomain{}, nil
  36. } else {
  37. return nil, err
  38. }
  39. }
  40. return &config, nil
  41. }
  42. // 覆盖更新指定用户的完整配置
  43. func UserInfoUpdateAllConfig(name string, config domain.UserConfigDomain) error {
  44. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  45. defer cancel()
  46. collection := database.GetCollection(CollectionName_UserInfo)
  47. filter := bson.M{"_id": name}
  48. // 覆盖字段(无论文档是否存在都会更新)
  49. updateFields := bson.M{
  50. "config": config,
  51. }
  52. setOnInsertFields := createUserInfoNewStruct(name)
  53. delete(setOnInsertFields, "config")
  54. update := bson.M{
  55. "$set": updateFields,
  56. "$setOnInsert": setOnInsertFields,
  57. }
  58. opts := options.Update().SetUpsert(true)
  59. _, err := collection.UpdateOne(ctx, filter, update, opts)
  60. if err != nil {
  61. return err
  62. }
  63. return nil
  64. }
  65. // 读取指定用户的SiteInfoManage配置
  66. func UserInfoReadSiteInfoManageConfig(name string) (*domain.SiteInfoManageConfig, error) {
  67. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  68. defer cancel()
  69. collection := database.GetCollection(CollectionName_UserInfo)
  70. filter := bson.M{"_id": name}
  71. // 只取 config 字段
  72. projection := bson.M{"config.siteInfoManage": 1}
  73. var config domain.UserInfoDomain
  74. err := collection.FindOne(ctx, filter, options.FindOne().SetProjection(projection)).Decode(&config)
  75. if err != nil {
  76. if err == mongo.ErrNoDocuments {
  77. // 未找到数据
  78. return nil, nil
  79. } else {
  80. return nil, err
  81. }
  82. }
  83. return config.Config.SiteInfoManage, nil
  84. }
  85. // 覆盖更新指定用户的SiteInfoManage配置文件
  86. func UserInfoUpdateSiteInfoManageConfig(name string, config domain.SiteInfoManageConfig) error {
  87. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  88. defer cancel()
  89. collection := database.GetCollection(CollectionName_UserInfo)
  90. filter := bson.M{"_id": name}
  91. // 覆盖字段(无论文档是否存在都会更新)
  92. updateFields := bson.M{
  93. "config.siteInfoManage": config,
  94. }
  95. setOnInsertFields := createUserInfoNewStruct(name)
  96. delete(setOnInsertFields, "config")
  97. update := bson.M{
  98. "$set": updateFields,
  99. "$setOnInsert": setOnInsertFields,
  100. }
  101. opts := options.Update().SetUpsert(true)
  102. _, err := collection.UpdateOne(ctx, filter, update, opts)
  103. if err != nil {
  104. return err
  105. }
  106. return nil
  107. }
  108. // 覆盖更新指定用户的SiteInfoManage配置文件中的TitleFilter
  109. func UserInfoUpdateSiteInfoManageConfigTitleFilter(name string, config []string) error {
  110. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  111. defer cancel()
  112. collection := database.GetCollection(CollectionName_UserInfo)
  113. filter := bson.M{"_id": name}
  114. // 覆盖字段(无论文档是否存在都会更新)
  115. updateFields := bson.M{
  116. "config.siteInfoManage.titleFilter": config,
  117. }
  118. setOnInsertFields := createUserInfoNewStruct(name)
  119. delete(setOnInsertFields, "config")
  120. update := bson.M{
  121. "$set": updateFields,
  122. "$setOnInsert": setOnInsertFields,
  123. }
  124. opts := options.Update().SetUpsert(true)
  125. _, err := collection.UpdateOne(ctx, filter, update, opts)
  126. if err != nil {
  127. return err
  128. }
  129. return nil
  130. }
  131. // 覆盖更新指定用户的SiteInfoManage配置文件中的CustomQueryFilter
  132. func UserInfoUpdateSiteInfoManageConfigCustomQueryFilter(name string, config []domain.SiteInfoQueryFilter) error {
  133. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  134. defer cancel()
  135. collection := database.GetCollection(CollectionName_UserInfo)
  136. filter := bson.M{"_id": name}
  137. // 覆盖字段(无论文档是否存在都会更新)
  138. updateFields := bson.M{
  139. "config.siteInfoManage.customQueryFilter": config,
  140. }
  141. setOnInsertFields := createUserInfoNewStruct(name)
  142. delete(setOnInsertFields, "config")
  143. update := bson.M{
  144. "$set": updateFields,
  145. "$setOnInsert": setOnInsertFields,
  146. }
  147. opts := options.Update().SetUpsert(true)
  148. _, err := collection.UpdateOne(ctx, filter, update, opts)
  149. if err != nil {
  150. return err
  151. }
  152. return nil
  153. }