package httpd import ( "html/template" "net/http" "gitbay.org/gitbay/internal/control" "gitbay.org/gitbay/internal/store" ) // orgScope resolves the org for its labels or milestones page. Members // see it; anyone else only when some repository under the org is // readable. Everything else is not found, the same answer as for a // user owner or an unknown name. func (s *Server) orgScope(w http.ResponseWriter, r *http.Request) (store.Org, store.User, []int64, bool) { viewer := s.viewer(r) org, err := s.st.OrgByName(r.PathValue("owner")) if err != nil { s.notFound(w, r) return org, viewer, nil, false } readable, err := control.ReadableOrgRepoIDs(s.st, viewer, org.ID) if err != nil { http.Error(w, "internal error", http.StatusInternalServerError) return org, viewer, nil, false } role := "" if viewer.ID != 0 { role, _ = s.st.OrgRole(org.ID, viewer.ID) } if role == "" && len(readable) == 0 { s.notFound(w, r) return org, viewer, nil, false } return org, viewer, readable, true } func (s *Server) orgLabels(w http.ResponseWriter, r *http.Request) { org, viewer, readable, ok := s.orgScope(w, r) if !ok { return } labels, err := s.st.ListOrgLabels(org.ID, readable) if err != nil { http.Error(w, "internal error", http.StatusInternalServerError) return } stored := make(map[string]string, len(labels)) for _, l := range labels { stored[l.Name] = l.Color } s.render(w, "orglabels.html", struct { basePage Org string Labels []store.Label LabelColors map[string]template.CSS }{s.baseFor(viewer), org.Name, labels, colorStyles(stored)}) } func (s *Server) orgMilestones(w http.ResponseWriter, r *http.Request) { org, viewer, readable, ok := s.orgScope(w, r) if !ok { return } state := r.URL.Query().Get("state") if state != "closed" && state != "all" { state = "open" } ms, err := s.st.ListOrgMilestones(org.ID, state, readable) if err != nil { http.Error(w, "internal error", http.StatusInternalServerError) return } type msView struct { store.Milestone Percent int } var views []msView for _, m := range ms { v := msView{Milestone: m} if total := m.OpenItems + m.ClosedItems; total > 0 { v.Percent = m.ClosedItems * 100 / total } views = append(views, v) } s.render(w, "orgmilestones.html", struct { basePage Org string State string Milestones []msView }{s.baseFor(viewer), org.Name, state, views}) }