internal/httpd/orgweb.go

96df83f2d3eb9f241bcaa53fcc243d090c53ab2b
gitbay/internal/httpd/orgweb.go history · blame · raw

85 lines · 2655 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	var argv []string
55	switch field {
56	case "member-add":
57		argv = []string{"org", "members", "add", owner, user}
58		if role := r.FormValue("role"); role == "admin" || role == "member" {
59			argv = append(argv, "--role", role)
60		}
61	case "member-remove":
62		argv = []string{"org", "members", "remove", owner, user}
63	case "team-create":
64		argv = []string{"org", "team", "create", owner, team}
65	case "team-delete":
66		argv = []string{"org", "team", "delete", owner, team}
67	case "team-add":
68		argv = append([]string{"org", "team", "add", owner, team}, strings.Fields(user)...)
69	case "team-remove":
70		argv = append([]string{"org", "team", "remove", owner, team}, strings.Fields(user)...)
71	case "team-grant":
72		argv = []string{"org", "team", "grant", owner, team,
73			strings.TrimSpace(r.FormValue("repo")), r.FormValue("role")}
74	case "team-revoke":
75		argv = []string{"org", "team", "revoke", owner, team, strings.TrimSpace(r.FormValue("repo"))}
76	default:
77		back("unknown form")
78		return
79	}
80	if _, msg, ok := s.runControl(u, argv); !ok {
81		back(msg)
82		return
83	}
84	back("")
85}