From f070dc2da8b41822ad3845097345e8bf4a6fe026 Mon Sep 17 00:00:00 2001 From: helen_yrofeeva Date: Sat, 12 Sep 2026 18:36:34 +0300 Subject: [PATCH] EPMHLM-568 pass SelectorType UI change to BE from proxy --- .../rest/HealeniumRestService.java | 32 +++++++++----- .../service/SettingsService.java | 43 ++++++++++++++----- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/epam/healenium/healenium_proxy/rest/HealeniumRestService.java b/src/main/java/com/epam/healenium/healenium_proxy/rest/HealeniumRestService.java index b4f7f59..b05250b 100644 --- a/src/main/java/com/epam/healenium/healenium_proxy/rest/HealeniumRestService.java +++ b/src/main/java/com/epam/healenium/healenium_proxy/rest/HealeniumRestService.java @@ -123,17 +123,17 @@ public Mono getImage(String screenshotPath, String tenantId) { } /** - * Update the log level in the backend service + * Update a setting in the backend service (SCORE_CAP, RECOVERY_TRIES, SELECTOR_TYPE, LOG_LEVEL, …) * - * @param logLevel The log level to set (ERROR, WARN, INFO, DEBUG, TRACE) - * @param loggerName The name of the logger to update (not used anymore, kept for compatibility) - * @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev) + * @param key Setting key expected by backend {@code /healenium/settings/update} + * @param value New value + * @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev) * @return Mono with the response from the backend service */ - public Mono> updateBackendLogLevel(String logLevel, String loggerName, String tenantId) { + public Mono> updateBackendSetting(String key, String value, String tenantId) { Map requestBody = Map.of( - "key", "LOG_LEVEL", - "value", logLevel + "key", key, + "value", value ); return backendCall(tenantId, () -> backendClient(tenantId) @@ -142,17 +142,29 @@ public Mono> updateBackendLogLevel(String logLevel, String l .uri(BACKEND_SETTINGS_UPDATE_URI) .bodyValue(requestBody) .retrieve() - .bodyToMono(new ParameterizedTypeReference>() { + .bodyToMono(new ParameterizedTypeReference>() { }) .onErrorResume(e -> { - log.error("Error updating backend log level: {}", e.getMessage(), e); + log.error("Error updating backend setting {} = {}: {}", key, value, e.getMessage(), e); return Mono.just(Map.of( "status", "error", - "message", "Error updating backend log level: " + e.getMessage() + "message", "Error updating backend setting: " + e.getMessage() )); })); } + /** + * Update the log level in the backend service + * + * @param logLevel The log level to set (ERROR, WARN, INFO, DEBUG, TRACE) + * @param loggerName The name of the logger to update (not used anymore, kept for compatibility) + * @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev) + * @return Mono with the response from the backend service + */ + public Mono> updateBackendLogLevel(String logLevel, String loggerName, String tenantId) { + return updateBackendSetting("LOG_LEVEL", logLevel, tenantId); + } + /** * Update the log level in the AI service * diff --git a/src/main/java/com/epam/healenium/healenium_proxy/service/SettingsService.java b/src/main/java/com/epam/healenium/healenium_proxy/service/SettingsService.java index 3a27cec..a3231e7 100644 --- a/src/main/java/com/epam/healenium/healenium_proxy/service/SettingsService.java +++ b/src/main/java/com/epam/healenium/healenium_proxy/service/SettingsService.java @@ -107,7 +107,7 @@ public Mono> updateSingleSetting(String key, String value, S try { switch (key) { case "SELECTOR_TYPE": - handleSelectorType(value, response, errors); + handleSelectorType(value, response, errors, tenantId); return buildResponse(key, value, response, errors); case "HEAL_ENABLED": @@ -115,11 +115,11 @@ public Mono> updateSingleSetting(String key, String value, S return buildResponse(key, value, response, errors); case "RECOVERY_TRIES": - handleRecoveryTries(Integer.parseInt(value), response, errors); + handleRecoveryTries(Integer.parseInt(value), response, errors, tenantId); return buildResponse(key, value, response, errors); case "SCORE_CAP": - handleScoreCap(Double.parseDouble(value), response, errors); + handleScoreCap(Double.parseDouble(value), response, errors, tenantId); return buildResponse(key, value, response, errors); case "LOG_LEVEL": @@ -131,6 +131,7 @@ public Mono> updateSingleSetting(String key, String value, S "FIND_ELEMENTS_AUTO_HEALING": response.put(MESSAGE, "Setting " + key + " is managed by backend service"); response.put(SUCCESS, true); + updateBackendSetting(key, value, tenantId); return buildResponse(key, value, response, errors); case "NODE_PATH_SHORTCUT", @@ -180,14 +181,19 @@ private Map buildResponse(String key, String value, Map response, Map errors) { + handleSelectorType(value, response, errors, ""); + } + + private void handleSelectorType(String value, Map response, Map errors, String tenantId) { String validationError = validateSelectorType(value); if (validationError == null) { proxyConfig.updateConfigValue("selector-type", value); response.put("selectorType", value); updatePlaywrightProxySetting("SELECTOR_TYPE", value); + updateBackendSetting("SELECTOR_TYPE", value, tenantId); } else { errors.put("selectorType", validationError); } @@ -203,28 +209,38 @@ private void handleHealEnabled(Boolean value, Map response, Map< } /** - * Handle recovery tries setting update (shared with Playwright proxy) + * Handle recovery tries setting update (proxy + playwright-proxy + backend) */ private void handleRecoveryTries(Integer value, Map response, Map errors) { + handleRecoveryTries(value, response, errors, ""); + } + + private void handleRecoveryTries(Integer value, Map response, Map errors, String tenantId) { String validationError = validateRecoveryTries(value); if (validationError == null) { proxyConfig.updateConfigValue("recovery-tries", value); response.put("recoveryTries", value); updatePlaywrightProxySetting("RECOVERY_TRIES", value.toString()); + updateBackendSetting("RECOVERY_TRIES", value.toString(), tenantId); } else { errors.put("recoveryTries", validationError); } } /** - * Handle score cap setting update (shared with Playwright proxy) + * Handle score cap setting update (proxy + playwright-proxy + backend) */ private void handleScoreCap(Double value, Map response, Map errors) { + handleScoreCap(value, response, errors, ""); + } + + private void handleScoreCap(Double value, Map response, Map errors, String tenantId) { String validationError = validateScoreCap(value); if (validationError == null) { proxyConfig.updateConfigValue("score-cap", value); response.put("scoreCap", value); updatePlaywrightProxySetting("SCORE_CAP", value.toString()); + updateBackendSetting("SCORE_CAP", value.toString(), tenantId); } else { errors.put("scoreCap", validationError); } @@ -371,14 +387,21 @@ private String validateLogLevel(String logLevel) { * Update the log level in the backend service */ private void updateBackendLogLevel(String logLevel, String tenantId) { + updateBackendSetting("LOG_LEVEL", logLevel, tenantId); + } + + /** + * Propagate a setting to healenium-backend asynchronously + */ + private void updateBackendSetting(String key, String value, String tenantId) { try { - restService.updateBackendLogLevel(logLevel, "ROOT", tenantId) + restService.updateBackendSetting(key, value, tenantId) .subscribe( - result -> log.debug("Backend log level updated successfully: {}", result), - error -> log.error("Error updating backend log level", error) + result -> log.debug("Backend setting updated successfully: {} = {}", key, value), + error -> log.warn("Could not update backend setting {} = {}: {}", key, value, error.getMessage()) ); } catch (Exception e) { - log.error("Error updating backend log level", e); + log.error("Error updating backend setting: " + key, e); } }