fetch_ml/internal/api/routes.go
Jeremie Fraeys f92e0bbdf9
feat: implement WebSocket handlers by delegating to sub-packages
Implemented WebSocket handlers by creating and integrating sub-packages:

**New package: api/datasets**
- HandleDatasetList, HandleDatasetRegister, HandleDatasetInfo, HandleDatasetSearch
- Binary protocol parsing for each operation

**Updated ws/handler.go**
- Added jobsHandler, jupyterHandler, datasetsHandler fields
- Updated NewHandler to accept sub-handlers
- Implemented handleAnnotateRun -> api/jobs
- Implemented handleSetRunNarrative -> api/jobs
- Implemented handleStartJupyter -> api/jupyter
- Implemented handleStopJupyter -> api/jupyter
- Implemented handleListJupyter -> api/jupyter
- Implemented handleDatasetList -> api/datasets
- Implemented handleDatasetRegister -> api/datasets
- Implemented handleDatasetInfo -> api/datasets
- Implemented handleDatasetSearch -> api/datasets

**Updated api/routes.go**
- Create jobs, jupyter, and datasets handlers
- Pass all handlers to ws.NewHandler

Build passes, all tests pass.
2026-02-17 20:49:31 -05:00

97 lines
2.4 KiB
Go

package api
import (
"net/http"
"github.com/jfraeys/fetch_ml/internal/api/datasets"
"github.com/jfraeys/fetch_ml/internal/api/jobs"
"github.com/jfraeys/fetch_ml/internal/api/jupyter"
"github.com/jfraeys/fetch_ml/internal/api/ws"
"github.com/jfraeys/fetch_ml/internal/prommetrics"
)
// registerRoutes sets up all HTTP routes and handlers
func (s *Server) registerRoutes(mux *http.ServeMux) {
// Register Prometheus metrics endpoint (if enabled)
if s.config.Monitoring.Prometheus.Enabled {
s.promMetrics = prommetrics.New()
s.logger.Info("prometheus metrics initialized")
// Register metrics endpoint
metricsPath := s.config.Monitoring.Prometheus.Path
if metricsPath == "" {
metricsPath = "/metrics"
}
mux.Handle(metricsPath, s.promMetrics.Handler())
s.logger.Info("metrics endpoint registered", "path", metricsPath)
}
// Register health check endpoints (if enabled)
if s.config.Monitoring.HealthChecks.Enabled {
s.registerHealthRoutes(mux)
}
// Register WebSocket endpoint
s.registerWebSocketRoutes(mux)
// Register HTTP API handlers
s.handlers.RegisterHandlers(mux)
}
// registerHealthRoutes sets up health check endpoints
func (s *Server) registerHealthRoutes(mux *http.ServeMux) {
healthHandler := NewHealthHandler(s)
healthHandler.RegisterRoutes(mux)
mux.HandleFunc("/health/ok", s.handlers.handleHealth)
s.logger.Info("health check endpoints registered")
}
// registerWebSocketRoutes sets up WebSocket endpoint
func (s *Server) registerWebSocketRoutes(mux *http.ServeMux) {
// Initialize audit logger for WebSocket connections
auditLogger := s.initAuditLogger()
// Register WebSocket handler with security config and audit logger
securityCfg := getSecurityConfig(s.config)
// Create jobs handler
jobsHandler := jobs.NewHandler(
s.expManager,
s.logger,
s.taskQueue,
s.db,
s.config.BuildAuthConfig(),
)
// Create jupyter handler
jupyterHandler := jupyter.NewHandler(
s.logger,
s.jupyterServiceMgr,
s.config.BuildAuthConfig(),
)
// Create datasets handler
datasetsHandler := datasets.NewHandler(
s.logger,
s.db,
s.config.DataDir,
)
wsHandler := ws.NewHandler(
s.config.BuildAuthConfig(),
s.logger,
s.expManager,
s.config.DataDir,
s.taskQueue,
s.db,
s.jupyterServiceMgr,
securityCfg,
auditLogger,
jobsHandler,
jupyterHandler,
datasetsHandler,
)
mux.Handle("/ws", wsHandler)
s.logger.Info("websocket endpoint registered")
}