internal/httpd/orglabels.go

v1.41.0
gitbay/internal/httpd/orglabels.go history · blame · raw

96 lines · 2628 bytes

 1package httpd
 2
 3import (
 4	"html/template"
 5	"net/http"
 6
 7	"gitbay.org/gitbay/internal/control"
 8	"gitbay.org/gitbay/internal/store"
 9)
10
11// orgScope resolves the org for its labels or milestones page. Members
12// see it; anyone else only when some repository under the org is
13// readable. Everything else is not found, the same answer as for a
14// user owner or an unknown name.
15func (s *Server) orgScope(w http.ResponseWriter, r *http.Request) (store.Org, store.User, []int64, bool, bool) {
16	viewer := s.viewer(r)
17	org, err := s.st.OrgByName(r.PathValue("owner"))
18	if err != nil {
19		s.notFound(w, r)
20		return org, viewer, nil, false, false
21	}
22	readable, err := control.ReadableOrgRepoIDs(s.st, viewer, org.ID)
23	if err != nil {
24		http.Error(w, "internal error", http.StatusInternalServerError)
25		return org, viewer, nil, false, false
26	}
27	role := ""
28	if viewer.ID != 0 {
29		role, _ = s.st.OrgRole(org.ID, viewer.ID)
30	}
31	if role == "" && len(readable) == 0 {
32		s.notFound(w, r)
33		return org, viewer, nil, false, false
34	}
35	return org, viewer, readable, true, role == "admin"
36}
37
38func (s *Server) orgLabels(w http.ResponseWriter, r *http.Request) {
39	org, viewer, readable, ok, admin := s.orgScope(w, r)
40	if !ok {
41		return
42	}
43	labels, err := s.st.ListOrgLabels(org.ID, readable)
44	if err != nil {
45		http.Error(w, "internal error", http.StatusInternalServerError)
46		return
47	}
48	stored := make(map[string]string, len(labels))
49	for _, l := range labels {
50		stored[l.Name] = l.Color
51	}
52	s.render(w, "orglabels.html", struct {
53		basePage
54		Org         string
55		Labels      []store.Label
56		LabelColors map[string]template.CSS
57		CanAdmin    bool
58		Notice      string
59	}{s.baseFor(viewer), org.Name, labels, colorStyles(stored), admin, s.takeFlash(w, r)})
60}
61
62func (s *Server) orgMilestones(w http.ResponseWriter, r *http.Request) {
63	org, viewer, readable, ok, admin := s.orgScope(w, r)
64	if !ok {
65		return
66	}
67	state := r.URL.Query().Get("state")
68	if state != "closed" && state != "all" {
69		state = "open"
70	}
71	ms, err := s.st.ListOrgMilestones(org.ID, state, readable)
72	if err != nil {
73		http.Error(w, "internal error", http.StatusInternalServerError)
74		return
75	}
76	type msView struct {
77		store.Milestone
78		Percent int
79	}
80	var views []msView
81	for _, m := range ms {
82		v := msView{Milestone: m}
83		if total := m.OpenItems + m.ClosedItems; total > 0 {
84			v.Percent = m.ClosedItems * 100 / total
85		}
86		views = append(views, v)
87	}
88	s.render(w, "orgmilestones.html", struct {
89		basePage
90		Org        string
91		State      string
92		Milestones []msView
93		CanAdmin   bool
94		Notice     string
95	}{s.baseFor(viewer), org.Name, state, views, admin, s.takeFlash(w, r)})
96}