fix(push-config): 解决 schemaV2 vendors 嵌套与 upsert 问题

- SdkConfigController: 向 SDK 下发 pushConfig 时自动解包 vendors 层,客户端 SDK 读取 xiaomi/vivo 等顶层字段
- FeatureServiceManager.updateConfig: 改为 upsert 模式,服务未激活时先创建再更新,不再报 404

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-06-25 16:57:30 +08:00
父节点 6b73a757fb
当前提交 1bd9a39422
共有 2 个文件被更改,包括 26 次插入2 次删除

查看文件

@ -77,10 +77,22 @@ public class SdkConfigController {
.findByAppKeyAndPlatformAndServiceType(app.getAppKey(), platform, FeatureServiceEntity.ServiceType.UPDATE)
.map(feature -> parseConfig(feature.getConfig()))
.orElseGet(objectMapper::createObjectNode);
JsonNode pushConfig = featureServiceRepository
// schemaV2 格式存储时 vendors 在嵌套层客户端 SDK 读的是顶层 xiaomi/huawei 等字段需解包
JsonNode rawPushConfig = featureServiceRepository
.findByAppKeyAndPlatformAndServiceType(app.getAppKey(), platform, FeatureServiceEntity.ServiceType.PUSH)
.map(feature -> parseConfig(feature.getConfig()))
.orElseGet(objectMapper::createObjectNode);
JsonNode pushConfig;
if (rawPushConfig.has("vendors") && rawPushConfig.path("vendors").isObject()) {
com.fasterxml.jackson.databind.node.ObjectNode flat = objectMapper.createObjectNode();
rawPushConfig.path("vendors").fields().forEachRemaining(e -> flat.set(e.getKey(), e.getValue()));
if (rawPushConfig.has("profiles")) {
flat.set("profiles", rawPushConfig.get("profiles"));
}
pushConfig = flat;
} else {
pushConfig = rawPushConfig;
}
boolean updateEnabled = deployProps.isEnableUpdate() && featureServiceRepository
.findByAppKeyAndPlatformAndServiceType(app.getAppKey(), platform, FeatureServiceEntity.ServiceType.UPDATE)
.map(FeatureServiceEntity::isEnabled)

查看文件

@ -270,7 +270,19 @@ public class FeatureServiceManager {
return services.get(0);
}
FeatureServiceEntity entity = getOrFail(appKey, platform, serviceType);
// PUSH / UPDATE允许在服务未激活时提前保存配置upsert
FeatureServiceEntity entity = repository
.findByAppKeyAndPlatformAndServiceType(appKey, platform, serviceType)
.orElseGet(() -> {
FeatureServiceEntity created = new FeatureServiceEntity();
created.setId(java.util.UUID.randomUUID().toString());
created.setAppKey(appKey);
created.setPlatform(platform);
created.setServiceType(serviceType);
created.setEnabled(false);
created.setCreatedAt(java.time.LocalDateTime.now());
return created;
});
entity.setConfig(config);
return repository.save(entity);
}