internal/httpd/orglabels.go
96 lines · 2628 bytes
3 symbols in this file
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}