feat: persist route catalog on agent register and heartbeat

Wire RouteCatalogStore into AgentRegistrationController and call upsert
after registration and heartbeat so routes survive server restarts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-16 18:47:22 +02:00
parent c4f4477472
commit 462b9a4bf0

View File

@@ -19,6 +19,7 @@ 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.security.Ed25519SigningService;
import com.cameleer.server.core.storage.RouteCatalogStore;
import com.cameleer.server.core.security.InvalidTokenException;
import com.cameleer.server.core.security.JwtService;
import io.swagger.v3.oas.annotations.Operation;
@@ -68,6 +69,7 @@ public class AgentRegistrationController {
private final AuditService auditService;
private final JdbcTemplate jdbc;
private final RouteStateRegistry routeStateRegistry;
private final RouteCatalogStore routeCatalogStore;
public AgentRegistrationController(AgentRegistryService registryService,
AgentRegistryConfig config,
@@ -77,7 +79,8 @@ public class AgentRegistrationController {
AgentEventService agentEventService,
AuditService auditService,
@org.springframework.beans.factory.annotation.Qualifier("clickHouseJdbcTemplate") JdbcTemplate jdbc,
RouteStateRegistry routeStateRegistry) {
RouteStateRegistry routeStateRegistry,
RouteCatalogStore routeCatalogStore) {
this.registryService = registryService;
this.config = config;
this.bootstrapTokenValidator = bootstrapTokenValidator;
@@ -87,6 +90,7 @@ public class AgentRegistrationController {
this.auditService = auditService;
this.jdbc = jdbc;
this.routeStateRegistry = routeStateRegistry;
this.routeCatalogStore = routeCatalogStore;
}
@PostMapping("/register")
@@ -125,6 +129,11 @@ public class AgentRegistrationController {
request.instanceId(), request.instanceId(), application, environmentId,
request.version(), routeIds, capabilities);
// Persist routes in catalog for server-restart recovery
if (!routeIds.isEmpty()) {
routeCatalogStore.upsert(application, environmentId, routeIds);
}
if (reRegistration) {
log.info("Agent re-registered: {} (application={}, routes={}, capabilities={})",
request.instanceId(), application, routeIds.size(), capabilities.keySet());
@@ -260,6 +269,15 @@ public class AgentRegistrationController {
}
}
// Persist routes in catalog for server-restart recovery
if (routeIds != null && !routeIds.isEmpty()) {
AgentInfo agentForCatalog = registryService.findById(id);
if (agentForCatalog != null) {
String catalogEnv = agentForCatalog.environmentId();
routeCatalogStore.upsert(agentForCatalog.applicationId(), catalogEnv, routeIds);
}
}
return ResponseEntity.ok().build();
}