From 10b412c50cd282418915393b0bdebae563d06b61 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Thu, 16 Apr 2026 18:50:13 +0200 Subject: [PATCH] feat: merge persistent route catalog into legacy catalog endpoint Add RouteCatalogStore as a third data source in RouteCatalogController so that /api/v1/routes/catalog surfaces routes with zero executions and routes from previous app versions that fall within the requested time window. Co-Authored-By: Claude Sonnet 4.6 --- .../controller/RouteCatalogController.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/RouteCatalogController.java b/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/RouteCatalogController.java index 847900b2..7591bf43 100644 --- a/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/RouteCatalogController.java +++ b/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/RouteCatalogController.java @@ -9,6 +9,8 @@ import com.cameleer.server.core.agent.AgentRegistryService; import com.cameleer.server.core.agent.AgentState; import com.cameleer.server.core.agent.RouteStateRegistry; import com.cameleer.server.core.storage.DiagramStore; +import com.cameleer.server.core.storage.RouteCatalogEntry; +import com.cameleer.server.core.storage.RouteCatalogStore; import com.cameleer.server.core.storage.StatsStore; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -42,15 +44,18 @@ public class RouteCatalogController { private final DiagramStore diagramStore; private final JdbcTemplate jdbc; private final RouteStateRegistry routeStateRegistry; + private final RouteCatalogStore routeCatalogStore; public RouteCatalogController(AgentRegistryService registryService, DiagramStore diagramStore, @org.springframework.beans.factory.annotation.Qualifier("clickHouseJdbcTemplate") JdbcTemplate jdbc, - RouteStateRegistry routeStateRegistry) { + RouteStateRegistry routeStateRegistry, + RouteCatalogStore routeCatalogStore) { this.registryService = registryService; this.diagramStore = diagramStore; this.jdbc = jdbc; this.routeStateRegistry = routeStateRegistry; + this.routeCatalogStore = routeCatalogStore; } @GetMapping("/catalog") @@ -122,6 +127,20 @@ public class RouteCatalogController { } } + // Merge routes from persistent catalog (covers routes with 0 executions + // and routes from previous app versions within the selected time window) + try { + List catalogEntries = (environment != null && !environment.isBlank()) + ? routeCatalogStore.findByEnvironment(environment, rangeFrom, rangeTo) + : routeCatalogStore.findAll(rangeFrom, rangeTo); + for (RouteCatalogEntry entry : catalogEntries) { + routesByApp.computeIfAbsent(entry.applicationId(), k -> new LinkedHashSet<>()) + .add(entry.routeId()); + } + } catch (Exception e) { + log.warn("Failed to query route catalog: {}", e.getMessage()); + } + // Build catalog entries — merge apps from agent registry + ClickHouse data Set allAppIds = new LinkedHashSet<>(agentsByApp.keySet()); allAppIds.addAll(routesByApp.keySet());