package api import ( "database/sql" "net/http" "strconv" "git.pengzhan.dev/haopengzhan/rsspipe/internal/models" "github.com/go-chi/chi/v5" ) func (h *Handler) ListJobs(w http.ResponseWriter, r *http.Request) { q := r.URL.Query() limit, _ := strconv.Atoi(q.Get("limit")) offset, _ := strconv.Atoi(q.Get("offset")) filter := models.JobFilter{ Type: q.Get("type"), Status: q.Get("status"), Limit: limit, Offset: offset, } jobs, err := h.jobService.ListJobs(r.Context(), filter) if err != nil { h.writeError(w, http.StatusInternalServerError, err.Error()) return } if jobs == nil { jobs = []models.Job{} } h.writeJSON(w, http.StatusOK, map[string]interface{}{ "jobs": jobs, "limit": limit, "offset": offset, }) } func (h *Handler) GetJob(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") job, err := h.jobService.GetJob(r.Context(), id) if err != nil { if err == sql.ErrNoRows { h.writeError(w, http.StatusNotFound, "job not found") return } h.writeError(w, http.StatusInternalServerError, err.Error()) return } h.writeJSON(w, http.StatusOK, job) } func (h *Handler) CancelJob(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") if err := h.jobService.CancelJob(r.Context(), id); err != nil { h.writeError(w, http.StatusInternalServerError, err.Error()) return } h.writeJSON(w, http.StatusOK, map[string]string{"message": "job cancelled"}) } func (h *Handler) RetryJob(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") if err := h.jobService.RetryJob(r.Context(), id); err != nil { h.writeError(w, http.StatusInternalServerError, err.Error()) return } h.writeJSON(w, http.StatusOK, map[string]string{"message": "job queued for retry"}) }