- Refactor internal/worker and internal/queue packages - Update cmd/tui for monitoring interface - Update test configurations
156 lines
4.6 KiB
Go
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",
|
|
})
|
|
}
|