package handlers import ( "fmt" "strconv" "strings" "github.com/gofiber/fiber/v2" "polar/internal/web/middleware" ) // RepoPullReviewSubmit records the reviewer's verdict (approve / request changes). func (h *Handler) RepoPullReviewSubmit(c *fiber.Ctx) error { r, _, err := h.loadAuthorizedRepo(c, false) if err != nil { return nil } if !r.EnablePulls { return h.renderErrorT(c, fiber.StatusNotFound, "err.not_found", "err.pulls_disabled") } num, _ := strconv.Atoi(c.Params("number")) pr, err := h.repoSvc.GetPullRequest(c.UserContext(), r.ID, num) if err != nil { return h.renderErrorT(c, fiber.StatusNotFound, "err.pr_not_found", "err.pr_not_found_desc") } u := middleware.CurrentUser(c) redirect := fmt.Sprintf("/%s/%s/pulls/%d", r.OwnerUsername, r.Name, pr.Number) if u == nil || u.ID == pr.AuthorID { h.setFlashT(c, "flash.review_self") return c.Redirect(redirect, fiber.StatusSeeOther) } if pr.Status != "open" { h.setFlashT(c, "flash.review_closed") return c.Redirect(redirect, fiber.StatusSeeOther) } state := strings.TrimSpace(c.FormValue("state")) body := strings.TrimSpace(c.FormValue("body")) if err := h.repoSvc.UpsertReview(c.UserContext(), pr.ID, u.ID, state, body); err != nil { h.setFlashT(c, "flash.review_failed", err.Error()) return c.Redirect(redirect, fiber.StatusSeeOther) } if state == "approved" { h.setFlashT(c, "flash.review_approved") } else { h.setFlashT(c, "flash.review_changes_requested") } return c.Redirect(redirect, fiber.StatusSeeOther) }