pkg/client/gerrit/project_access.go (96 lines of code) (raw):

package gerrit import ( "fmt" "github.com/pkg/errors" "gopkg.in/resty.v1" ) type AccessInfo struct { RefPattern string `json:"refPattern"` PermissionName string `json:"permissionName"` PermissionLabel string `json:"permissionLabel,omitempty"` GroupName string `json:"groupName"` Action string `json:"action"` Force bool `json:"force"` Min int `json:"min"` Max int `json:"max"` } type groupPermissions struct { Min int `json:"min"` Max int `json:"max"` Force bool `json:"force"` Action string `json:"action"` Modified bool `json:"modified"` Added bool `json:"added"` } type permission struct { Label string `json:"label"` Rules map[string]groupPermissions `json:"rules"` } type reference struct { Permissions map[string]permission `json:"permissions"` } func (gc *Client) AddAccessRights(projectName string, permissions []AccessInfo) error { accessInfo := generateSetAccessRequest(permissions, true, false) addRequest := map[string]map[string]reference{"add": accessInfo} rsp, err := gc.resty.R().SetBody(addRequest).SetHeader(contentType, applicationJson). Post(fmt.Sprintf("/projects/%s/access", projectName)) return parseRestyResponse(rsp, err) } func (gc *Client) UpdateAccessRights(projectName string, permissions []AccessInfo) error { accessInfo := generateSetAccessRequest(permissions, false, true) addRequest := map[string]map[string]reference{"add": accessInfo, "remove": accessInfo} rsp, err := gc.resty.R().SetBody(addRequest).SetHeader(contentType, applicationJson). Post(fmt.Sprintf("/projects/%s/access", projectName)) return parseRestyResponse(rsp, err) } func (gc *Client) DeleteAccessRights(projectName string, permissions []AccessInfo) error { accessInfo := generateSetAccessRequest(permissions, false, false) addRequest := map[string]map[string]reference{"remove": accessInfo} rsp, err := gc.resty.R().SetBody(addRequest).SetHeader(contentType, applicationJson). Post(fmt.Sprintf("/projects/%s/access", projectName)) return parseRestyResponse(rsp, err) } func generateSetAccessRequest(permissions []AccessInfo, added, modified bool) map[string]reference { refs := make(map[string]reference) for _, perm := range permissions { _, ok := refs[perm.RefPattern] if !ok { ref := reference{Permissions: make(map[string]permission)} refs[perm.RefPattern] = ref } _, ok = refs[perm.RefPattern].Permissions[perm.PermissionName] if !ok { permName := permission{Rules: make(map[string]groupPermissions), Label: perm.PermissionLabel} refs[perm.RefPattern].Permissions[perm.PermissionName] = permName } _, ok = refs[perm.RefPattern].Permissions[perm.PermissionName].Rules[perm.GroupName] if !ok { groupPerm := groupPermissions{ Action: perm.Action, Force: perm.Force, Max: perm.Max, Min: perm.Min, Added: added, Modified: modified, } refs[perm.RefPattern].Permissions[perm.PermissionName].Rules[perm.GroupName] = groupPerm } } return refs } func (gc *Client) SetProjectParent(projectName, parentName string) error { rsp, err := gc.resty.R().SetBody(map[string]string{ "parent": parentName, }).SetHeader(contentType, applicationJson). Put(fmt.Sprintf("/projects/%s/parent", projectName)) return parseRestyResponse(rsp, err) } func parseRestyResponse(rsp *resty.Response, err error) error { if err != nil { return errors.Wrap(err, "error during post request") } if rsp.IsError() { return errors.Errorf("status: %s, body: %s", rsp.Status(), rsp.String()) } return nil }