fetch_ml/internal/api/adapter.go
Jeremie Fraeys 23e5f3d1dc
refactor(api): internal refactoring for TUI and worker modules
- Refactor internal/worker and internal/queue packages
- Update cmd/tui for monitoring interface
- Update test configurations
2026-02-20 15:51:23 -05:00

156 lines
4.6 KiB
Go

// Package api provides HTTP handlers and OpenAPI-generated server interface implementations
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/labstack/echo/v4"
)
// HandlerAdapter implements the generated ServerInterface using existing handlers
type HandlerAdapter struct {
jobsHandler *jobs.Handler
jupyterHandler *jupyter.Handler
datasetsHandler *datasets.Handler
}
// NewHandlerAdapter creates a new handler adapter
func NewHandlerAdapter(
jobsHandler *jobs.Handler,
jupyterHandler *jupyter.Handler,
datasetsHandler *datasets.Handler,
) *HandlerAdapter {
return &HandlerAdapter{
jobsHandler: jobsHandler,
jupyterHandler: jupyterHandler,
datasetsHandler: datasetsHandler,
}
}
// Ensure HandlerAdapter implements the generated interface
var _ ServerInterface = (*HandlerAdapter)(nil)
// toHTTPHandler converts echo.Context to standard HTTP handler
func toHTTPHandler(h func(http.ResponseWriter, *http.Request)) echo.HandlerFunc {
return func(c echo.Context) error {
h(c.Response().Writer, c.Request())
return nil
}
}
// GetHealth implements the health check endpoint
func (a *HandlerAdapter) GetHealth(ctx echo.Context) error {
return ctx.String(200, "OK\n")
}
// GetV1Experiments lists all experiments
func (a *HandlerAdapter) GetV1Experiments(ctx echo.Context) error {
return ctx.JSON(200, map[string]any{
"experiments": []any{},
"message": "Not yet implemented",
})
}
// PostV1Experiments creates a new experiment
func (a *HandlerAdapter) PostV1Experiments(ctx echo.Context) error {
return ctx.JSON(201, map[string]any{
"message": "Not yet implemented",
})
}
// GetV1JupyterServices lists all Jupyter services
func (a *HandlerAdapter) GetV1JupyterServices(ctx echo.Context) error {
if a.jupyterHandler == nil {
return ctx.JSON(503, map[string]any{
"error": "Jupyter service not available",
"code": "SERVICE_UNAVAILABLE",
})
}
return toHTTPHandler(a.jupyterHandler.ListServicesHTTP)(ctx)
}
// PostV1JupyterServices starts a new Jupyter service
func (a *HandlerAdapter) PostV1JupyterServices(ctx echo.Context) error {
if a.jupyterHandler == nil {
return ctx.JSON(503, map[string]any{
"error": "Jupyter service not available",
"code": "SERVICE_UNAVAILABLE",
})
}
return toHTTPHandler(a.jupyterHandler.StartServiceHTTP)(ctx)
}
// DeleteV1JupyterServicesServiceId stops a Jupyter service
func (a *HandlerAdapter) DeleteV1JupyterServicesServiceId(ctx echo.Context, serviceId string) error {
if a.jupyterHandler == nil {
return ctx.JSON(503, map[string]any{
"error": "Jupyter service not available",
"code": "SERVICE_UNAVAILABLE",
})
}
// TODO: Implement when StopServiceHTTP is available
return ctx.JSON(501, map[string]any{
"error": "Not implemented",
"code": "NOT_IMPLEMENTED",
"message": "Jupyter service stop not yet implemented via REST API",
})
}
// GetV1Queue returns queue status
func (a *HandlerAdapter) GetV1Queue(ctx echo.Context) error {
return ctx.JSON(200, map[string]any{
"status": "healthy",
"pending": 0,
"running": 0,
})
}
// GetV1Tasks lists all tasks
func (a *HandlerAdapter) GetV1Tasks(ctx echo.Context, params GetV1TasksParams) error {
if a.jobsHandler == nil {
return ctx.JSON(503, map[string]any{
"error": "Jobs handler not available",
"code": "SERVICE_UNAVAILABLE",
})
}
return toHTTPHandler(a.jobsHandler.ListAllJobsHTTP)(ctx)
}
// PostV1Tasks creates a new task
func (a *HandlerAdapter) PostV1Tasks(ctx echo.Context) error {
return ctx.JSON(501, map[string]any{
"error": "Not implemented",
"code": "NOT_IMPLEMENTED",
"message": "Task creation via REST API not yet implemented - use WebSocket",
})
}
// DeleteV1TasksTaskId cancels/deletes a task
func (a *HandlerAdapter) DeleteV1TasksTaskId(ctx echo.Context, taskId string) error {
return ctx.JSON(501, map[string]any{
"error": "Not implemented",
"code": "NOT_IMPLEMENTED",
"message": "Task cancellation via REST API not yet implemented - use WebSocket",
})
}
// GetV1TasksTaskId gets task details
func (a *HandlerAdapter) GetV1TasksTaskId(ctx echo.Context, taskId string) error {
return ctx.JSON(501, map[string]any{
"error": "Not implemented",
"code": "NOT_IMPLEMENTED",
"message": "Task details via REST API not yet implemented - use WebSocket",
})
}
// GetWs handles WebSocket connections
func (a *HandlerAdapter) GetWs(ctx echo.Context) error {
return ctx.JSON(426, map[string]any{
"error": "WebSocket connection required",
"code": "UPGRADE_REQUIRED",
"message": "Use WebSocket protocol to connect to this endpoint",
})
}