internal/httpd/orglabels.go
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}