package api_impl // SPDX-License-Identifier: GPL-3.0-or-later import ( "errors" "net/http" "git.blender.org/flamenco/internal/manager/persistence" "git.blender.org/flamenco/internal/uuid" "git.blender.org/flamenco/pkg/api" "github.com/labstack/echo/v4" ) func (f *Flamenco) FetchWorkers(e echo.Context) error { dbWorkers, err := f.persist.FetchWorkers(e.Request().Context()) if err != nil { return sendAPIError(e, http.StatusInternalServerError, "error fetching workers: %v", err) } apiWorkers := make([]api.WorkerSummary, len(dbWorkers)) for i := range dbWorkers { apiWorkers[i] = workerSummary(*dbWorkers[i]) } return e.JSON(http.StatusOK, api.WorkerList{ Workers: apiWorkers, }) } func (f *Flamenco) FetchWorker(e echo.Context, workerUUID string) error { logger := requestLogger(e) logger = logger.With().Str("worker", workerUUID).Logger() if !uuid.IsValid(workerUUID) { return sendAPIError(e, http.StatusBadRequest, "not a valid UUID") } dbWorker, err := f.persist.FetchWorker(e.Request().Context(), workerUUID) if errors.Is(err, persistence.ErrWorkerNotFound) { logger.Debug().Msg("non-existent worker requested") return sendAPIError(e, http.StatusNotFound, "worker %q not found", workerUUID) } if err != nil { logger.Error().Err(err).Msg("error fetching worker") return sendAPIError(e, http.StatusInternalServerError, "error fetching worker: %v", err) } logger.Debug().Msg("fetched worker") apiWorker := workerDBtoAPI(dbWorker) return e.JSON(http.StatusOK, apiWorker) } func workerSummary(w persistence.Worker) api.WorkerSummary { summary := api.WorkerSummary{ Id: w.UUID, Nickname: w.Name, Status: w.Status, } if w.StatusRequested != "" { summary.StatusRequested = &w.StatusRequested } return summary } func workerDBtoAPI(dbWorker *persistence.Worker) api.Worker { apiWorker := api.Worker{ Id: dbWorker.UUID, IpAddress: dbWorker.Address, Nickname: dbWorker.Name, Platform: dbWorker.Platform, Status: dbWorker.Status, SupportedTaskTypes: dbWorker.TaskTypes(), Version: dbWorker.Software, } if dbWorker.StatusRequested != "" { apiWorker.StatusRequested = &dbWorker.StatusRequested } return apiWorker }