diff --git a/cmd/server/main.go b/cmd/server/main.go index ee2eae2..c89316d 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -289,26 +289,26 @@ func main() { // Build the API router with all handlers apiRouter := router.New() - apiRouter.RegisterHandlers( - certificateHandler, - issuerHandler, - targetHandler, - agentHandler, - jobHandler, - policyHandler, - profileHandler, - teamHandler, - ownerHandler, - agentGroupHandler, - auditHandler, - notificationHandler, - statsHandler, - metricsHandler, - healthHandler, - discoveryHandler, - networkScanHandler, - verificationHandler, - ) + apiRouter.RegisterHandlers(router.HandlerRegistry{ + Certificates: certificateHandler, + Issuers: issuerHandler, + Targets: targetHandler, + Agents: agentHandler, + Jobs: jobHandler, + Policies: policyHandler, + Profiles: profileHandler, + Teams: teamHandler, + Owners: ownerHandler, + AgentGroups: agentGroupHandler, + Audit: auditHandler, + Notifications: notificationHandler, + Stats: statsHandler, + Metrics: metricsHandler, + Health: healthHandler, + Discovery: discoveryHandler, + NetworkScan: networkScanHandler, + Verification: verificationHandler, + }) // Register EST (RFC 7030) handlers if enabled if cfg.EST.Enabled { issuerConn, ok := issuerRegistry[cfg.EST.IssuerID] diff --git a/internal/api/router/router.go b/internal/api/router/router.go index e58b57c..bd155f1 100644 --- a/internal/api/router/router.go +++ b/internal/api/router/router.go @@ -43,175 +43,178 @@ func (r *Router) RegisterFunc(pattern string, handler func(http.ResponseWriter, r.Register(pattern, http.HandlerFunc(handler)) } +// HandlerRegistry groups all API handler dependencies for router registration. +type HandlerRegistry struct { + Certificates handler.CertificateHandler + Issuers handler.IssuerHandler + Targets handler.TargetHandler + Agents handler.AgentHandler + Jobs handler.JobHandler + Policies handler.PolicyHandler + Profiles handler.ProfileHandler + Teams handler.TeamHandler + Owners handler.OwnerHandler + AgentGroups handler.AgentGroupHandler + Audit handler.AuditHandler + Notifications handler.NotificationHandler + Stats handler.StatsHandler + Metrics handler.MetricsHandler + Health handler.HealthHandler + Discovery handler.DiscoveryHandler + NetworkScan handler.NetworkScanHandler + Verification handler.VerificationHandler +} + // RegisterHandlers sets up all API routes with their handlers. -func (r *Router) RegisterHandlers( - certificates handler.CertificateHandler, - issuers handler.IssuerHandler, - targets handler.TargetHandler, - agents handler.AgentHandler, - jobs handler.JobHandler, - policies handler.PolicyHandler, - profiles handler.ProfileHandler, - teams handler.TeamHandler, - owners handler.OwnerHandler, - agentGroups handler.AgentGroupHandler, - audit handler.AuditHandler, - notifications handler.NotificationHandler, - stats handler.StatsHandler, - metrics handler.MetricsHandler, - health handler.HealthHandler, - discovery handler.DiscoveryHandler, - networkScan handler.NetworkScanHandler, - verification handler.VerificationHandler, -) { +func (r *Router) RegisterHandlers(reg HandlerRegistry) { // Health endpoints (no auth middleware — must always be accessible) r.mux.Handle("GET /health", middleware.Chain( - http.HandlerFunc(health.Health), + http.HandlerFunc(reg.Health.Health), middleware.CORS, middleware.ContentType, )) r.mux.Handle("GET /ready", middleware.Chain( - http.HandlerFunc(health.Ready), + http.HandlerFunc(reg.Health.Ready), middleware.CORS, middleware.ContentType, )) // Auth info endpoint (no auth middleware — GUI needs this before login) r.mux.Handle("GET /api/v1/auth/info", middleware.Chain( - http.HandlerFunc(health.AuthInfo), + http.HandlerFunc(reg.Health.AuthInfo), middleware.CORS, middleware.ContentType, )) // Auth check endpoint (uses full middleware chain via r.Register) - r.Register("GET /api/v1/auth/check", http.HandlerFunc(health.AuthCheck)) + r.Register("GET /api/v1/auth/check", http.HandlerFunc(reg.Health.AuthCheck)) // Certificates routes: /api/v1/certificates - r.Register("GET /api/v1/certificates", http.HandlerFunc(certificates.ListCertificates)) - r.Register("POST /api/v1/certificates", http.HandlerFunc(certificates.CreateCertificate)) - r.Register("GET /api/v1/certificates/{id}", http.HandlerFunc(certificates.GetCertificate)) - r.Register("PUT /api/v1/certificates/{id}", http.HandlerFunc(certificates.UpdateCertificate)) - r.Register("DELETE /api/v1/certificates/{id}", http.HandlerFunc(certificates.ArchiveCertificate)) - r.Register("GET /api/v1/certificates/{id}/versions", http.HandlerFunc(certificates.GetCertificateVersions)) - r.Register("GET /api/v1/certificates/{id}/deployments", http.HandlerFunc(certificates.GetCertificateDeployments)) - r.Register("POST /api/v1/certificates/{id}/renew", http.HandlerFunc(certificates.TriggerRenewal)) - r.Register("POST /api/v1/certificates/{id}/deploy", http.HandlerFunc(certificates.TriggerDeployment)) - r.Register("POST /api/v1/certificates/{id}/revoke", http.HandlerFunc(certificates.RevokeCertificate)) + r.Register("GET /api/v1/certificates", http.HandlerFunc(reg.Certificates.ListCertificates)) + r.Register("POST /api/v1/certificates", http.HandlerFunc(reg.Certificates.CreateCertificate)) + r.Register("GET /api/v1/certificates/{id}", http.HandlerFunc(reg.Certificates.GetCertificate)) + r.Register("PUT /api/v1/certificates/{id}", http.HandlerFunc(reg.Certificates.UpdateCertificate)) + r.Register("DELETE /api/v1/certificates/{id}", http.HandlerFunc(reg.Certificates.ArchiveCertificate)) + r.Register("GET /api/v1/certificates/{id}/versions", http.HandlerFunc(reg.Certificates.GetCertificateVersions)) + r.Register("GET /api/v1/certificates/{id}/deployments", http.HandlerFunc(reg.Certificates.GetCertificateDeployments)) + r.Register("POST /api/v1/certificates/{id}/renew", http.HandlerFunc(reg.Certificates.TriggerRenewal)) + r.Register("POST /api/v1/certificates/{id}/deploy", http.HandlerFunc(reg.Certificates.TriggerDeployment)) + r.Register("POST /api/v1/certificates/{id}/revoke", http.HandlerFunc(reg.Certificates.RevokeCertificate)) // CRL endpoints: /api/v1/crl (JSON) and /api/v1/crl/{issuer_id} (DER) - r.Register("GET /api/v1/crl", http.HandlerFunc(certificates.GetCRL)) - r.Register("GET /api/v1/crl/{issuer_id}", http.HandlerFunc(certificates.GetDERCRL)) + r.Register("GET /api/v1/crl", http.HandlerFunc(reg.Certificates.GetCRL)) + r.Register("GET /api/v1/crl/{issuer_id}", http.HandlerFunc(reg.Certificates.GetDERCRL)) // OCSP responder: /api/v1/ocsp/{issuer_id}/{serial} - r.Register("GET /api/v1/ocsp/{issuer_id}/{serial}", http.HandlerFunc(certificates.HandleOCSP)) + r.Register("GET /api/v1/ocsp/{issuer_id}/{serial}", http.HandlerFunc(reg.Certificates.HandleOCSP)) // Issuers routes: /api/v1/issuers - r.Register("GET /api/v1/issuers", http.HandlerFunc(issuers.ListIssuers)) - r.Register("POST /api/v1/issuers", http.HandlerFunc(issuers.CreateIssuer)) - r.Register("GET /api/v1/issuers/{id}", http.HandlerFunc(issuers.GetIssuer)) - r.Register("PUT /api/v1/issuers/{id}", http.HandlerFunc(issuers.UpdateIssuer)) - r.Register("DELETE /api/v1/issuers/{id}", http.HandlerFunc(issuers.DeleteIssuer)) - r.Register("POST /api/v1/issuers/{id}/test", http.HandlerFunc(issuers.TestConnection)) + r.Register("GET /api/v1/issuers", http.HandlerFunc(reg.Issuers.ListIssuers)) + r.Register("POST /api/v1/issuers", http.HandlerFunc(reg.Issuers.CreateIssuer)) + r.Register("GET /api/v1/issuers/{id}", http.HandlerFunc(reg.Issuers.GetIssuer)) + r.Register("PUT /api/v1/issuers/{id}", http.HandlerFunc(reg.Issuers.UpdateIssuer)) + r.Register("DELETE /api/v1/issuers/{id}", http.HandlerFunc(reg.Issuers.DeleteIssuer)) + r.Register("POST /api/v1/issuers/{id}/test", http.HandlerFunc(reg.Issuers.TestConnection)) // Targets routes: /api/v1/targets - r.Register("GET /api/v1/targets", http.HandlerFunc(targets.ListTargets)) - r.Register("POST /api/v1/targets", http.HandlerFunc(targets.CreateTarget)) - r.Register("GET /api/v1/targets/{id}", http.HandlerFunc(targets.GetTarget)) - r.Register("PUT /api/v1/targets/{id}", http.HandlerFunc(targets.UpdateTarget)) - r.Register("DELETE /api/v1/targets/{id}", http.HandlerFunc(targets.DeleteTarget)) + r.Register("GET /api/v1/targets", http.HandlerFunc(reg.Targets.ListTargets)) + r.Register("POST /api/v1/targets", http.HandlerFunc(reg.Targets.CreateTarget)) + r.Register("GET /api/v1/targets/{id}", http.HandlerFunc(reg.Targets.GetTarget)) + r.Register("PUT /api/v1/targets/{id}", http.HandlerFunc(reg.Targets.UpdateTarget)) + r.Register("DELETE /api/v1/targets/{id}", http.HandlerFunc(reg.Targets.DeleteTarget)) // Agents routes: /api/v1/agents - r.Register("GET /api/v1/agents", http.HandlerFunc(agents.ListAgents)) - r.Register("POST /api/v1/agents", http.HandlerFunc(agents.RegisterAgent)) - r.Register("GET /api/v1/agents/{id}", http.HandlerFunc(agents.GetAgent)) - r.Register("POST /api/v1/agents/{id}/heartbeat", http.HandlerFunc(agents.Heartbeat)) - r.Register("POST /api/v1/agents/{id}/csr", http.HandlerFunc(agents.AgentCSRSubmit)) - r.Register("GET /api/v1/agents/{id}/certificates/{cert_id}", http.HandlerFunc(agents.AgentCertificatePickup)) - r.Register("GET /api/v1/agents/{id}/work", http.HandlerFunc(agents.AgentGetWork)) - r.Register("POST /api/v1/agents/{id}/jobs/{job_id}/status", http.HandlerFunc(agents.AgentReportJobStatus)) + r.Register("GET /api/v1/agents", http.HandlerFunc(reg.Agents.ListAgents)) + r.Register("POST /api/v1/agents", http.HandlerFunc(reg.Agents.RegisterAgent)) + r.Register("GET /api/v1/agents/{id}", http.HandlerFunc(reg.Agents.GetAgent)) + r.Register("POST /api/v1/agents/{id}/heartbeat", http.HandlerFunc(reg.Agents.Heartbeat)) + r.Register("POST /api/v1/agents/{id}/csr", http.HandlerFunc(reg.Agents.AgentCSRSubmit)) + r.Register("GET /api/v1/agents/{id}/certificates/{cert_id}", http.HandlerFunc(reg.Agents.AgentCertificatePickup)) + r.Register("GET /api/v1/agents/{id}/work", http.HandlerFunc(reg.Agents.AgentGetWork)) + r.Register("POST /api/v1/agents/{id}/jobs/{job_id}/status", http.HandlerFunc(reg.Agents.AgentReportJobStatus)) // Jobs routes: /api/v1/jobs - r.Register("GET /api/v1/jobs", http.HandlerFunc(jobs.ListJobs)) - r.Register("GET /api/v1/jobs/{id}", http.HandlerFunc(jobs.GetJob)) - r.Register("POST /api/v1/jobs/{id}/cancel", http.HandlerFunc(jobs.CancelJob)) - r.Register("POST /api/v1/jobs/{id}/approve", http.HandlerFunc(jobs.ApproveJob)) - r.Register("POST /api/v1/jobs/{id}/reject", http.HandlerFunc(jobs.RejectJob)) + r.Register("GET /api/v1/jobs", http.HandlerFunc(reg.Jobs.ListJobs)) + r.Register("GET /api/v1/jobs/{id}", http.HandlerFunc(reg.Jobs.GetJob)) + r.Register("POST /api/v1/jobs/{id}/cancel", http.HandlerFunc(reg.Jobs.CancelJob)) + r.Register("POST /api/v1/jobs/{id}/approve", http.HandlerFunc(reg.Jobs.ApproveJob)) + r.Register("POST /api/v1/jobs/{id}/reject", http.HandlerFunc(reg.Jobs.RejectJob)) // Policies routes: /api/v1/policies - r.Register("GET /api/v1/policies", http.HandlerFunc(policies.ListPolicies)) - r.Register("POST /api/v1/policies", http.HandlerFunc(policies.CreatePolicy)) - r.Register("GET /api/v1/policies/{id}", http.HandlerFunc(policies.GetPolicy)) - r.Register("PUT /api/v1/policies/{id}", http.HandlerFunc(policies.UpdatePolicy)) - r.Register("DELETE /api/v1/policies/{id}", http.HandlerFunc(policies.DeletePolicy)) - r.Register("GET /api/v1/policies/{id}/violations", http.HandlerFunc(policies.ListViolations)) + r.Register("GET /api/v1/policies", http.HandlerFunc(reg.Policies.ListPolicies)) + r.Register("POST /api/v1/policies", http.HandlerFunc(reg.Policies.CreatePolicy)) + r.Register("GET /api/v1/policies/{id}", http.HandlerFunc(reg.Policies.GetPolicy)) + r.Register("PUT /api/v1/policies/{id}", http.HandlerFunc(reg.Policies.UpdatePolicy)) + r.Register("DELETE /api/v1/policies/{id}", http.HandlerFunc(reg.Policies.DeletePolicy)) + r.Register("GET /api/v1/policies/{id}/violations", http.HandlerFunc(reg.Policies.ListViolations)) // Profiles routes: /api/v1/profiles - r.Register("GET /api/v1/profiles", http.HandlerFunc(profiles.ListProfiles)) - r.Register("POST /api/v1/profiles", http.HandlerFunc(profiles.CreateProfile)) - r.Register("GET /api/v1/profiles/{id}", http.HandlerFunc(profiles.GetProfile)) - r.Register("PUT /api/v1/profiles/{id}", http.HandlerFunc(profiles.UpdateProfile)) - r.Register("DELETE /api/v1/profiles/{id}", http.HandlerFunc(profiles.DeleteProfile)) + r.Register("GET /api/v1/profiles", http.HandlerFunc(reg.Profiles.ListProfiles)) + r.Register("POST /api/v1/profiles", http.HandlerFunc(reg.Profiles.CreateProfile)) + r.Register("GET /api/v1/profiles/{id}", http.HandlerFunc(reg.Profiles.GetProfile)) + r.Register("PUT /api/v1/profiles/{id}", http.HandlerFunc(reg.Profiles.UpdateProfile)) + r.Register("DELETE /api/v1/profiles/{id}", http.HandlerFunc(reg.Profiles.DeleteProfile)) // Teams routes: /api/v1/teams - r.Register("GET /api/v1/teams", http.HandlerFunc(teams.ListTeams)) - r.Register("POST /api/v1/teams", http.HandlerFunc(teams.CreateTeam)) - r.Register("GET /api/v1/teams/{id}", http.HandlerFunc(teams.GetTeam)) - r.Register("PUT /api/v1/teams/{id}", http.HandlerFunc(teams.UpdateTeam)) - r.Register("DELETE /api/v1/teams/{id}", http.HandlerFunc(teams.DeleteTeam)) + r.Register("GET /api/v1/teams", http.HandlerFunc(reg.Teams.ListTeams)) + r.Register("POST /api/v1/teams", http.HandlerFunc(reg.Teams.CreateTeam)) + r.Register("GET /api/v1/teams/{id}", http.HandlerFunc(reg.Teams.GetTeam)) + r.Register("PUT /api/v1/teams/{id}", http.HandlerFunc(reg.Teams.UpdateTeam)) + r.Register("DELETE /api/v1/teams/{id}", http.HandlerFunc(reg.Teams.DeleteTeam)) // Owners routes: /api/v1/owners - r.Register("GET /api/v1/owners", http.HandlerFunc(owners.ListOwners)) - r.Register("POST /api/v1/owners", http.HandlerFunc(owners.CreateOwner)) - r.Register("GET /api/v1/owners/{id}", http.HandlerFunc(owners.GetOwner)) - r.Register("PUT /api/v1/owners/{id}", http.HandlerFunc(owners.UpdateOwner)) - r.Register("DELETE /api/v1/owners/{id}", http.HandlerFunc(owners.DeleteOwner)) + r.Register("GET /api/v1/owners", http.HandlerFunc(reg.Owners.ListOwners)) + r.Register("POST /api/v1/owners", http.HandlerFunc(reg.Owners.CreateOwner)) + r.Register("GET /api/v1/owners/{id}", http.HandlerFunc(reg.Owners.GetOwner)) + r.Register("PUT /api/v1/owners/{id}", http.HandlerFunc(reg.Owners.UpdateOwner)) + r.Register("DELETE /api/v1/owners/{id}", http.HandlerFunc(reg.Owners.DeleteOwner)) // Agent Groups routes: /api/v1/agent-groups - r.Register("GET /api/v1/agent-groups", http.HandlerFunc(agentGroups.ListAgentGroups)) - r.Register("POST /api/v1/agent-groups", http.HandlerFunc(agentGroups.CreateAgentGroup)) - r.Register("GET /api/v1/agent-groups/{id}", http.HandlerFunc(agentGroups.GetAgentGroup)) - r.Register("PUT /api/v1/agent-groups/{id}", http.HandlerFunc(agentGroups.UpdateAgentGroup)) - r.Register("DELETE /api/v1/agent-groups/{id}", http.HandlerFunc(agentGroups.DeleteAgentGroup)) - r.Register("GET /api/v1/agent-groups/{id}/members", http.HandlerFunc(agentGroups.ListAgentGroupMembers)) + r.Register("GET /api/v1/agent-groups", http.HandlerFunc(reg.AgentGroups.ListAgentGroups)) + r.Register("POST /api/v1/agent-groups", http.HandlerFunc(reg.AgentGroups.CreateAgentGroup)) + r.Register("GET /api/v1/agent-groups/{id}", http.HandlerFunc(reg.AgentGroups.GetAgentGroup)) + r.Register("PUT /api/v1/agent-groups/{id}", http.HandlerFunc(reg.AgentGroups.UpdateAgentGroup)) + r.Register("DELETE /api/v1/agent-groups/{id}", http.HandlerFunc(reg.AgentGroups.DeleteAgentGroup)) + r.Register("GET /api/v1/agent-groups/{id}/members", http.HandlerFunc(reg.AgentGroups.ListAgentGroupMembers)) // Audit routes: /api/v1/audit - r.Register("GET /api/v1/audit", http.HandlerFunc(audit.ListAuditEvents)) - r.Register("GET /api/v1/audit/{id}", http.HandlerFunc(audit.GetAuditEvent)) + r.Register("GET /api/v1/audit", http.HandlerFunc(reg.Audit.ListAuditEvents)) + r.Register("GET /api/v1/audit/{id}", http.HandlerFunc(reg.Audit.GetAuditEvent)) // Notifications routes: /api/v1/notifications - r.Register("GET /api/v1/notifications", http.HandlerFunc(notifications.ListNotifications)) - r.Register("GET /api/v1/notifications/{id}", http.HandlerFunc(notifications.GetNotification)) - r.Register("POST /api/v1/notifications/{id}/read", http.HandlerFunc(notifications.MarkAsRead)) + r.Register("GET /api/v1/notifications", http.HandlerFunc(reg.Notifications.ListNotifications)) + r.Register("GET /api/v1/notifications/{id}", http.HandlerFunc(reg.Notifications.GetNotification)) + r.Register("POST /api/v1/notifications/{id}/read", http.HandlerFunc(reg.Notifications.MarkAsRead)) // Stats routes: /api/v1/stats - r.Register("GET /api/v1/stats/summary", http.HandlerFunc(stats.GetDashboardSummary)) - r.Register("GET /api/v1/stats/certificates-by-status", http.HandlerFunc(stats.GetCertificatesByStatus)) - r.Register("GET /api/v1/stats/expiration-timeline", http.HandlerFunc(stats.GetExpirationTimeline)) - r.Register("GET /api/v1/stats/job-trends", http.HandlerFunc(stats.GetJobTrends)) - r.Register("GET /api/v1/stats/issuance-rate", http.HandlerFunc(stats.GetIssuanceRate)) + r.Register("GET /api/v1/stats/summary", http.HandlerFunc(reg.Stats.GetDashboardSummary)) + r.Register("GET /api/v1/stats/certificates-by-status", http.HandlerFunc(reg.Stats.GetCertificatesByStatus)) + r.Register("GET /api/v1/stats/expiration-timeline", http.HandlerFunc(reg.Stats.GetExpirationTimeline)) + r.Register("GET /api/v1/stats/job-trends", http.HandlerFunc(reg.Stats.GetJobTrends)) + r.Register("GET /api/v1/stats/issuance-rate", http.HandlerFunc(reg.Stats.GetIssuanceRate)) // Metrics routes: /api/v1/metrics - r.Register("GET /api/v1/metrics", http.HandlerFunc(metrics.GetMetrics)) - r.Register("GET /api/v1/metrics/prometheus", http.HandlerFunc(metrics.GetPrometheusMetrics)) + r.Register("GET /api/v1/metrics", http.HandlerFunc(reg.Metrics.GetMetrics)) + r.Register("GET /api/v1/metrics/prometheus", http.HandlerFunc(reg.Metrics.GetPrometheusMetrics)) // Discovery routes: /api/v1/discovered-certificates, /api/v1/discovery-scans - r.Register("POST /api/v1/agents/{id}/discoveries", http.HandlerFunc(discovery.SubmitDiscoveryReport)) - r.Register("GET /api/v1/discovered-certificates", http.HandlerFunc(discovery.ListDiscovered)) - r.Register("GET /api/v1/discovered-certificates/{id}", http.HandlerFunc(discovery.GetDiscovered)) - r.Register("POST /api/v1/discovered-certificates/{id}/claim", http.HandlerFunc(discovery.ClaimDiscovered)) - r.Register("POST /api/v1/discovered-certificates/{id}/dismiss", http.HandlerFunc(discovery.DismissDiscovered)) - r.Register("GET /api/v1/discovery-scans", http.HandlerFunc(discovery.ListScans)) - r.Register("GET /api/v1/discovery-summary", http.HandlerFunc(discovery.GetDiscoverySummary)) + r.Register("POST /api/v1/agents/{id}/discoveries", http.HandlerFunc(reg.Discovery.SubmitDiscoveryReport)) + r.Register("GET /api/v1/discovered-certificates", http.HandlerFunc(reg.Discovery.ListDiscovered)) + r.Register("GET /api/v1/discovered-certificates/{id}", http.HandlerFunc(reg.Discovery.GetDiscovered)) + r.Register("POST /api/v1/discovered-certificates/{id}/claim", http.HandlerFunc(reg.Discovery.ClaimDiscovered)) + r.Register("POST /api/v1/discovered-certificates/{id}/dismiss", http.HandlerFunc(reg.Discovery.DismissDiscovered)) + r.Register("GET /api/v1/discovery-scans", http.HandlerFunc(reg.Discovery.ListScans)) + r.Register("GET /api/v1/discovery-summary", http.HandlerFunc(reg.Discovery.GetDiscoverySummary)) // Network scan routes: /api/v1/network-scan-targets - r.Register("GET /api/v1/network-scan-targets", http.HandlerFunc(networkScan.ListNetworkScanTargets)) - r.Register("POST /api/v1/network-scan-targets", http.HandlerFunc(networkScan.CreateNetworkScanTarget)) - r.Register("GET /api/v1/network-scan-targets/{id}", http.HandlerFunc(networkScan.GetNetworkScanTarget)) - r.Register("PUT /api/v1/network-scan-targets/{id}", http.HandlerFunc(networkScan.UpdateNetworkScanTarget)) - r.Register("DELETE /api/v1/network-scan-targets/{id}", http.HandlerFunc(networkScan.DeleteNetworkScanTarget)) - r.Register("POST /api/v1/network-scan-targets/{id}/scan", http.HandlerFunc(networkScan.TriggerNetworkScan)) + r.Register("GET /api/v1/network-scan-targets", http.HandlerFunc(reg.NetworkScan.ListNetworkScanTargets)) + r.Register("POST /api/v1/network-scan-targets", http.HandlerFunc(reg.NetworkScan.CreateNetworkScanTarget)) + r.Register("GET /api/v1/network-scan-targets/{id}", http.HandlerFunc(reg.NetworkScan.GetNetworkScanTarget)) + r.Register("PUT /api/v1/network-scan-targets/{id}", http.HandlerFunc(reg.NetworkScan.UpdateNetworkScanTarget)) + r.Register("DELETE /api/v1/network-scan-targets/{id}", http.HandlerFunc(reg.NetworkScan.DeleteNetworkScanTarget)) + r.Register("POST /api/v1/network-scan-targets/{id}/scan", http.HandlerFunc(reg.NetworkScan.TriggerNetworkScan)) // Verification routes: /api/v1/jobs/{id}/verify and /api/v1/jobs/{id}/verification - r.Register("POST /api/v1/jobs/{id}/verify", http.HandlerFunc(verification.VerifyDeployment)) - r.Register("GET /api/v1/jobs/{id}/verification", http.HandlerFunc(verification.GetVerificationStatus)) + r.Register("POST /api/v1/jobs/{id}/verify", http.HandlerFunc(reg.Verification.VerifyDeployment)) + r.Register("GET /api/v1/jobs/{id}/verification", http.HandlerFunc(reg.Verification.GetVerificationStatus)) } // RegisterESTHandlers sets up EST (RFC 7030) routes under /.well-known/est/. diff --git a/internal/integration/lifecycle_test.go b/internal/integration/lifecycle_test.go index 2962197..23f2223 100644 --- a/internal/integration/lifecycle_test.go +++ b/internal/integration/lifecycle_test.go @@ -89,26 +89,26 @@ func TestCertificateLifecycle(t *testing.T) { // Create router and register handlers r := router.New() - r.RegisterHandlers( - certificateHandler, - issuerHandler, - targetHandler, - agentHandler, - jobHandler, - policyHandler, - profileHandler, - teamHandler, - ownerHandler, - agentGroupHandler, - auditHandler, - notificationHandler, - statsHandler, - metricsHandler, - healthHandler, - discoveryHandler, - networkScanHandler, - verificationHandler, - ) + r.RegisterHandlers(router.HandlerRegistry{ + Certificates: certificateHandler, + Issuers: issuerHandler, + Targets: targetHandler, + Agents: agentHandler, + Jobs: jobHandler, + Policies: policyHandler, + Profiles: profileHandler, + Teams: teamHandler, + Owners: ownerHandler, + AgentGroups: agentGroupHandler, + Audit: auditHandler, + Notifications: notificationHandler, + Stats: statsHandler, + Metrics: metricsHandler, + Health: healthHandler, + Discovery: discoveryHandler, + NetworkScan: networkScanHandler, + Verification: verificationHandler, + }) r.RegisterESTHandlers(estHandler) // Create test server diff --git a/internal/integration/negative_test.go b/internal/integration/negative_test.go index 14edfc1..724f9e1 100644 --- a/internal/integration/negative_test.go +++ b/internal/integration/negative_test.go @@ -81,26 +81,26 @@ func setupTestServer(t *testing.T) (*httptest.Server, *mockCertificateRepository estHandler := handler.NewESTHandler(estService) r := router.New() - r.RegisterHandlers( - certificateHandler, - issuerHandler, - targetHandler, - agentHandler, - jobHandler, - policyHandler, - profileHandler, - teamHandler, - ownerHandler, - agentGroupHandler, - auditHandler, - notificationHandler, - statsHandler, - metricsHandler, - healthHandler, - discoveryHandler, - networkScanHandler, - verificationHandler, - ) + r.RegisterHandlers(router.HandlerRegistry{ + Certificates: certificateHandler, + Issuers: issuerHandler, + Targets: targetHandler, + Agents: agentHandler, + Jobs: jobHandler, + Policies: policyHandler, + Profiles: profileHandler, + Teams: teamHandler, + Owners: ownerHandler, + AgentGroups: agentGroupHandler, + Audit: auditHandler, + Notifications: notificationHandler, + Stats: statsHandler, + Metrics: metricsHandler, + Health: healthHandler, + Discovery: discoveryHandler, + NetworkScan: networkScanHandler, + Verification: verificationHandler, + }) r.RegisterESTHandlers(estHandler) server := httptest.NewServer(r)