internal/httpd/orglabels.go

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

92 lines · 2440 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) {
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
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
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
34	}
35	return org, viewer, readable, true
36}
37
38func (s *Server) orgLabels(w http.ResponseWriter, r *http.Request) {
39	org, viewer, readable, ok := 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	}{s.baseFor(viewer), org.Name, labels, colorStyles(stored)})
58}
59
60func (s *Server) orgMilestones(w http.ResponseWriter, r *http.Request) {
61	org, viewer, readable, ok := s.orgScope(w, r)
62	if !ok {
63		return
64	}
65	state := r.URL.Query().Get("state")
66	if state != "closed" && state != "all" {
67		state = "open"
68	}
69	ms, err := s.st.ListOrgMilestones(org.ID, state, readable)
70	if err != nil {
71		http.Error(w, "internal error", http.StatusInternalServerError)
72		return
73	}
74	type msView struct {
75		store.Milestone
76		Percent int
77	}
78	var views []msView
79	for _, m := range ms {
80		v := msView{Milestone: m}
81		if total := m.OpenItems + m.ClosedItems; total > 0 {
82			v.Percent = m.ClosedItems * 100 / total
83		}
84		views = append(views, v)
85	}
86	s.render(w, "orgmilestones.html", struct {
87		basePage
88		Org        string
89		State      string
90		Milestones []msView
91	}{s.baseFor(viewer), org.Name, state, views})
92}