| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- package mongo
- import (
- "context"
- "fwh-toolbox-server/database"
- "fwh-toolbox-server/domain"
- "time"
- "go.mongodb.org/mongo-driver/bson"
- "go.mongodb.org/mongo-driver/mongo"
- "go.mongodb.org/mongo-driver/mongo/options"
- )
- const (
- CollectionName_UserInfo = "UserInfo"
- )
- // 创建新数据的结构体配置(文档不存在,插入新文档时使用)
- func createUserInfoNewStruct(name string) bson.M {
- return bson.M{
- "_id": name,
- "info": domain.UserBaseInfoDomain{},
- "config": domain.UserConfigDomain{},
- }
- }
- // 读取指定用户的完整配置
- func UserInfoReadAllConfig(name string) (*domain.UserConfigDomain, error) {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 只取 config 字段
- projection := bson.M{"config": 1}
- var config domain.UserConfigDomain
- err := collection.FindOne(ctx, filter, options.FindOne().SetProjection(projection)).Decode(&config)
- if err != nil {
- if err == mongo.ErrNoDocuments {
- // 未找到数据
- return &domain.UserConfigDomain{}, nil
- } else {
- return nil, err
- }
- }
- return &config, nil
- }
- // 覆盖更新指定用户的完整配置
- func UserInfoUpdateAllConfig(name string, config domain.UserConfigDomain) error {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 覆盖字段(无论文档是否存在都会更新)
- updateFields := bson.M{
- "config": config,
- }
- setOnInsertFields := createUserInfoNewStruct(name)
- delete(setOnInsertFields, "config")
- update := bson.M{
- "$set": updateFields,
- "$setOnInsert": setOnInsertFields,
- }
- opts := options.Update().SetUpsert(true)
- _, err := collection.UpdateOne(ctx, filter, update, opts)
- if err != nil {
- return err
- }
- return nil
- }
- // 读取指定用户的SiteInfoManage配置
- func UserInfoReadSiteInfoManageConfig(name string) (*domain.SiteInfoManageConfig, error) {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 只取 config 字段
- projection := bson.M{"config.siteInfoManage": 1}
- var config domain.UserInfoDomain
- err := collection.FindOne(ctx, filter, options.FindOne().SetProjection(projection)).Decode(&config)
- if err != nil {
- if err == mongo.ErrNoDocuments {
- // 未找到数据
- return nil, nil
- } else {
- return nil, err
- }
- }
- return config.Config.SiteInfoManage, nil
- }
- // 覆盖更新指定用户的SiteInfoManage配置文件
- func UserInfoUpdateSiteInfoManageConfig(name string, config domain.SiteInfoManageConfig) error {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 覆盖字段(无论文档是否存在都会更新)
- updateFields := bson.M{
- "config.siteInfoManage": config,
- }
- setOnInsertFields := createUserInfoNewStruct(name)
- delete(setOnInsertFields, "config")
- update := bson.M{
- "$set": updateFields,
- "$setOnInsert": setOnInsertFields,
- }
- opts := options.Update().SetUpsert(true)
- _, err := collection.UpdateOne(ctx, filter, update, opts)
- if err != nil {
- return err
- }
- return nil
- }
- // 覆盖更新指定用户的SiteInfoManage配置文件中的TitleFilter
- func UserInfoUpdateSiteInfoManageConfigTitleFilter(name string, config []string) error {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 覆盖字段(无论文档是否存在都会更新)
- updateFields := bson.M{
- "config.siteInfoManage.titleFilter": config,
- }
- setOnInsertFields := createUserInfoNewStruct(name)
- delete(setOnInsertFields, "config")
- update := bson.M{
- "$set": updateFields,
- "$setOnInsert": setOnInsertFields,
- }
- opts := options.Update().SetUpsert(true)
- _, err := collection.UpdateOne(ctx, filter, update, opts)
- if err != nil {
- return err
- }
- return nil
- }
- // 覆盖更新指定用户的SiteInfoManage配置文件中的CustomQueryFilter
- func UserInfoUpdateSiteInfoManageConfigCustomQueryFilter(name string, config []domain.SiteInfoQueryFilter) error {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- collection := database.GetCollection(CollectionName_UserInfo)
- filter := bson.M{"_id": name}
- // 覆盖字段(无论文档是否存在都会更新)
- updateFields := bson.M{
- "config.siteInfoManage.customQueryFilter": config,
- }
- setOnInsertFields := createUserInfoNewStruct(name)
- delete(setOnInsertFields, "config")
- update := bson.M{
- "$set": updateFields,
- "$setOnInsert": setOnInsertFields,
- }
- opts := options.Update().SetUpsert(true)
- _, err := collection.UpdateOne(ctx, filter, update, opts)
- if err != nil {
- return err
- }
- return nil
- }
|