From 1bd9a39422605e92f1e118f1e18536e6d03097df Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Thu, 25 Jun 2026 16:57:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(push-config):=20=E8=A7=A3=E5=86=B3=20schema?= =?UTF-8?q?V2=20vendors=20=E5=B5=8C=E5=A5=97=E4=B8=8E=20upsert=20=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SdkConfigController: 向 SDK 下发 pushConfig 时自动解包 vendors 层,客户端 SDK 读取 xiaomi/vivo 等顶层字段 - FeatureServiceManager.updateConfig: 改为 upsert 模式,服务未激活时先创建再更新,不再报 404 Co-Authored-By: Claude Sonnet 4.6 --- .../tenant/controller/SdkConfigController.java | 14 +++++++++++++- .../xuqm/tenant/service/FeatureServiceManager.java | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/tenant-service/src/main/java/com/xuqm/tenant/controller/SdkConfigController.java b/tenant-service/src/main/java/com/xuqm/tenant/controller/SdkConfigController.java index 3b35cee..55c97c9 100644 --- a/tenant-service/src/main/java/com/xuqm/tenant/controller/SdkConfigController.java +++ b/tenant-service/src/main/java/com/xuqm/tenant/controller/SdkConfigController.java @@ -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) diff --git a/tenant-service/src/main/java/com/xuqm/tenant/service/FeatureServiceManager.java b/tenant-service/src/main/java/com/xuqm/tenant/service/FeatureServiceManager.java index 901056d..7f820c9 100644 --- a/tenant-service/src/main/java/com/xuqm/tenant/service/FeatureServiceManager.java +++ b/tenant-service/src/main/java/com/xuqm/tenant/service/FeatureServiceManager.java @@ -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); }