internal/httpd/orgweb.go

f9845abbc93ead5d74684a56f2e677be71c69587
gitbay/internal/httpd/orgweb.go history · blame · raw

102 lines · 3162 bytes

  1package httpd
  2
  3import (
  4	"net/http"
  5	"strings"
  6
  7	"gitbay.org/gitbay/internal/store"
  8)
  9
 10// teamView is a team with the two things an admin needs to see about it:
 11// who is in it and what it reaches.
 12type teamView struct {
 13	Name    string
 14	Members []string
 15	Grants  []store.TeamGrant
 16}
 17
 18// orgAdminView gathers the management state for an organization page. It
 19// returns ok=false for user pages and for viewers who do not administer the
 20// org, so the page renders read-only for everyone else.
 21func (s *Server) orgAdminView(viewer store.User, kind, name string) (teams []teamView, ok bool) {
 22	if kind != "org" || viewer.ID == 0 {
 23		return nil, false
 24	}
 25	org, err := s.st.OrgByName(name)
 26	if err != nil {
 27		return nil, false
 28	}
 29	if role, _ := s.st.OrgRole(org.ID, viewer.ID); role != "admin" {
 30		return nil, false
 31	}
 32	list, _ := s.st.ListTeams(org.ID)
 33	for _, t := range list {
 34		members, _ := s.st.TeamMembers(t.ID)
 35		grants, _ := s.st.TeamGrants(t.ID)
 36		teams = append(teams, teamView{Name: t.Name, Members: members, Grants: grants})
 37	}
 38	return teams, true
 39}
 40
 41// orgSubmit routes the organization forms on an owner page. Every branch
 42// dispatches the matching control command, so membership rules and audit
 43// entries stay in one implementation.
 44func (s *Server) orgSubmit(w http.ResponseWriter, r *http.Request, u store.User) {
 45	owner := r.PathValue("owner")
 46	back := func(msg string) {
 47		s.setFlash(w, msg)
 48		http.Redirect(w, r, "/"+owner, http.StatusSeeOther)
 49	}
 50	field := r.FormValue("field")
 51	team := strings.TrimSpace(r.FormValue("team"))
 52	user := strings.TrimSpace(r.FormValue("user"))
 53
 54	// Create and rename land on a different page than the one they were
 55	// posted from: a new org has no page yet, and a renamed one has moved.
 56	switch field {
 57	case "org-create", "org-rename":
 58		name := strings.TrimSpace(r.FormValue("name"))
 59		argv := []string{"org", "create", name}
 60		if field == "org-rename" {
 61			argv = []string{"org", "rename", owner, name}
 62		}
 63		if _, msg, ok := s.runControl(u, argv); !ok {
 64			back(msg)
 65			return
 66		}
 67		http.Redirect(w, r, "/"+name, http.StatusSeeOther)
 68		return
 69	}
 70
 71	var argv []string
 72	switch field {
 73	case "member-add":
 74		argv = []string{"org", "members", "add", owner, user}
 75		if role := r.FormValue("role"); role == "admin" || role == "member" {
 76			argv = append(argv, "--role", role)
 77		}
 78	case "member-remove":
 79		argv = []string{"org", "members", "remove", owner, user}
 80	case "team-create":
 81		argv = []string{"org", "team", "create", owner, team}
 82	case "team-delete":
 83		argv = []string{"org", "team", "delete", owner, team}
 84	case "team-add":
 85		argv = append([]string{"org", "team", "add", owner, team}, strings.Fields(user)...)
 86	case "team-remove":
 87		argv = append([]string{"org", "team", "remove", owner, team}, strings.Fields(user)...)
 88	case "team-grant":
 89		argv = []string{"org", "team", "grant", owner, team,
 90			strings.TrimSpace(r.FormValue("repo")), r.FormValue("role")}
 91	case "team-revoke":
 92		argv = []string{"org", "team", "revoke", owner, team, strings.TrimSpace(r.FormValue("repo"))}
 93	default:
 94		back("unknown form")
 95		return
 96	}
 97	if _, msg, ok := s.runControl(u, argv); !ok {
 98		back(msg)
 99		return
100	}
101	back("")
102}