internal/httpd/orgweb.go

4744c629ed4f0158bdea7d0f1d207fdccb1f7f99
gitbay/internal/httpd/orgweb.go history · blame · raw

89 lines · 2723 bytes

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