internal/httpd/issueactions.go

eec36526d2721d98ac0d9446ba4e2975d16b5d8b
gitbay/internal/httpd/issueactions.go history · blame · raw

92 lines · 2572 bytes

 1package httpd
 2
 3import (
 4	"fmt"
 5	"net/http"
 6	"net/url"
 7	"strings"
 8
 9	"gitbay.org/gitbay/internal/store"
10)
11
12// Issue actions. Like the merge request controls, each one runs the
13// command the CLI runs, so label rules, access checks, and the system
14// comments they leave behind have a single implementation.
15
16func (s *Server) issueRedirect(w http.ResponseWriter, r *http.Request, msg string) {
17	dest := fmt.Sprintf("/%s/%s/issues/%s",
18		r.PathValue("owner"), r.PathValue("repo"), r.PathValue("n"))
19	if msg != "" {
20		if len(msg) > 300 {
21			msg = msg[:300]
22		}
23		dest += "?e=" + url.QueryEscape(msg)
24	}
25	http.Redirect(w, r, dest, http.StatusSeeOther)
26}
27
28func issueArgs(r *http.Request, verb string, extra ...string) []string {
29	repo := r.PathValue("owner") + "/" + r.PathValue("repo")
30	return append([]string{"issue", verb, repo, r.PathValue("n")}, extra...)
31}
32
33// issueStateSubmit closes or reopens, following the button pressed.
34func (s *Server) issueStateSubmit(w http.ResponseWriter, r *http.Request, u store.User) {
35	verb := "close"
36	if r.FormValue("action") == "reopen" {
37		verb = "reopen"
38	}
39	_, msg, ok := s.runControl(u, issueArgs(r, verb))
40	if ok {
41		msg = ""
42	}
43	s.issueRedirect(w, r, msg)
44}
45
46// fieldArgs turns a space-separated form value into repeated flags, the
47// shape the label and assign commands take.
48func fieldArgs(flag, values string) []string {
49	var out []string
50	for _, v := range strings.Fields(values) {
51		out = append(out, flag, v)
52	}
53	return out
54}
55
56func (s *Server) issueLabelSubmit(w http.ResponseWriter, r *http.Request, u store.User) {
57	args := append(fieldArgs("--add", r.FormValue("add")), fieldArgs("--remove", r.FormValue("remove"))...)
58	if len(args) == 0 {
59		s.issueRedirect(w, r, "name at least one label")
60		return
61	}
62	_, msg, ok := s.runControl(u, issueArgs(r, "label", args...))
63	if ok {
64		msg = ""
65	}
66	s.issueRedirect(w, r, msg)
67}
68
69func (s *Server) issueAssignSubmit(w http.ResponseWriter, r *http.Request, u store.User) {
70	args := append(fieldArgs("--add", r.FormValue("add")), fieldArgs("--remove", r.FormValue("remove"))...)
71	if len(args) == 0 {
72		s.issueRedirect(w, r, "name at least one person")
73		return
74	}
75	_, msg, ok := s.runControl(u, issueArgs(r, "assign", args...))
76	if ok {
77		msg = ""
78	}
79	s.issueRedirect(w, r, msg)
80}
81
82func (s *Server) issueMilestoneSubmit(w http.ResponseWriter, r *http.Request, u store.User) {
83	title := strings.TrimSpace(r.FormValue("milestone"))
84	if title == "" {
85		title = "none"
86	}
87	_, msg, ok := s.runControl(u, issueArgs(r, "milestone", title))
88	if ok {
89		msg = ""
90	}
91	s.issueRedirect(w, r, msg)
92}