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 }