package api import ( "encoding/json" "errors" "net/http" "github.com/go-chi/chi/v5" "github.com/iliaivanov/spec-kit-remote/cmd/dev-pod-api/internal/model" "github.com/iliaivanov/spec-kit-remote/cmd/dev-pod-api/internal/store" ) func (s *Server) handleRunnerCallback(w http.ResponseWriter, r *http.Request) { if s.Runners == nil { writeError(w, http.StatusServiceUnavailable, "runner management not configured") return } id := chi.URLParam(r, "id") var req model.UpdateRunnerStatusRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body") return } if err := req.Validate(); err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } if _, err := s.Runners.GetRunner(r.Context(), id); err != nil { if errors.Is(err, store.ErrNotFound) { writeError(w, http.StatusNotFound, "runner not found") return } writeError(w, http.StatusInternalServerError, "failed to get runner") return } if err := s.Runners.UpdateRunnerStatus(r.Context(), id, req.Status, req.ForgejoRunnerID); err != nil { s.Logger.Error("runner callback status update", "id", id, "status", req.Status, "error", err) writeError(w, http.StatusBadRequest, err.Error()) return } updated, err := s.Runners.GetRunner(r.Context(), id) if err != nil { writeError(w, http.StatusInternalServerError, "failed to get updated runner") return } writeJSON(w, http.StatusOK, updated) }