diff --git a/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/CatalogController.java b/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/CatalogController.java index 7fd2f1be..60b2b8fe 100644 --- a/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/CatalogController.java +++ b/cameleer-server-app/src/main/java/com/cameleer/server/app/controller/CatalogController.java @@ -196,7 +196,16 @@ public class CatalogController { } Set routeIds = routesByApp.getOrDefault(slug, Set.of()); - List agentIds = agents.stream().map(AgentInfo::instanceId).toList(); + + // Resolve the env slug for this row early so fromUri can survive + // cross-env queries (env==null) against managed apps. + String rowEnvSlug = envSlug; + if (app != null && rowEnvSlug.isEmpty()) { + try { + rowEnvSlug = envService.getById(app.environmentId()).slug(); + } catch (Exception ignored) {} + } + final String resolvedEnvSlug = rowEnvSlug; // Routes List routeSummaries = routeIds.stream() @@ -204,7 +213,7 @@ public class CatalogController { String key = slug + "/" + routeId; long count = routeExchangeCounts.getOrDefault(key, 0L); Instant lastSeen = routeLastSeen.get(key); - String fromUri = resolveFromEndpointUri(routeId, agentIds); + String fromUri = resolveFromEndpointUri(slug, routeId, resolvedEnvSlug); String state = routeStateRegistry.getState(slug, routeId).name().toLowerCase(); String routeState = "started".equals(state) ? null : state; return new RouteSummary(routeId, count, lastSeen, fromUri, routeState); @@ -258,15 +267,9 @@ public class CatalogController { String healthTooltip = buildHealthTooltip(app != null, deployStatus, agentHealth, agents.size()); String displayName = app != null ? app.displayName() : slug; - String appEnvSlug = envSlug; - if (app != null && appEnvSlug.isEmpty()) { - try { - appEnvSlug = envService.getById(app.environmentId()).slug(); - } catch (Exception ignored) {} - } catalog.add(new CatalogApp( - slug, displayName, app != null, appEnvSlug, + slug, displayName, app != null, resolvedEnvSlug, health, healthTooltip, agents.size(), routeSummaries, agentSummaries, totalExchanges, deploymentSummary )); @@ -275,8 +278,11 @@ public class CatalogController { return ResponseEntity.ok(catalog); } - private String resolveFromEndpointUri(String routeId, List agentIds) { - return diagramStore.findContentHashForRouteByAgents(routeId, agentIds) + private String resolveFromEndpointUri(String applicationId, String routeId, String environment) { + if (environment == null || environment.isBlank()) { + return null; + } + return diagramStore.findLatestContentHashForAppRoute(applicationId, routeId, environment) .flatMap(diagramStore::findByContentHash) .map(RouteGraph::getRoot) .map(root -> root.getEndpointUri()) 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 96bd415a..d4407810 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 @@ -132,13 +132,12 @@ public class RouteCatalogController { List agents = agentsByApp.getOrDefault(appId, List.of()); Set routeIds = routesByApp.getOrDefault(appId, Set.of()); - List agentIds = agents.stream().map(AgentInfo::instanceId).toList(); List routeSummaries = routeIds.stream() .map(routeId -> { String key = appId + "/" + routeId; long count = routeExchangeCounts.getOrDefault(key, 0L); Instant lastSeen = routeLastSeen.get(key); - String fromUri = resolveFromEndpointUri(routeId, agentIds); + String fromUri = resolveFromEndpointUri(appId, routeId, envSlug); String state = routeStateRegistry.getState(appId, routeId).name().toLowerCase(); String routeState = "started".equals(state) ? null : state; return new RouteSummary(routeId, count, lastSeen, fromUri, routeState); @@ -160,8 +159,8 @@ public class RouteCatalogController { return ResponseEntity.ok(catalog); } - private String resolveFromEndpointUri(String routeId, List agentIds) { - return diagramStore.findContentHashForRouteByAgents(routeId, agentIds) + private String resolveFromEndpointUri(String applicationId, String routeId, String environment) { + return diagramStore.findLatestContentHashForAppRoute(applicationId, routeId, environment) .flatMap(diagramStore::findByContentHash) .map(RouteGraph::getRoot) .map(root -> root.getEndpointUri())