client/group.go (195 lines of code) (raw):

package client import ( "bytes" "encoding/json" "errors" "fmt" "net/http" "net/url" "strings" "unicode" ) type Group struct { Key string `json:"key"` Name string `json:"name"` Roles *RoleAssignments `json:"roles,omitempty"` Parents *ParentGroups `json:"parent-groups,omitempty"` } type ParentGroups struct { Group []Group `json:"group"` } func (c *Client) NewGroup(group Group) (*Group, error) { if group.Key == "" { group.Key = generateKey(group.Name) } body, err := json.Marshal(group) if err != nil { return nil, err } req, err := http.NewRequest("POST", fmt.Sprintf("%s/userGroups", c.RestURL), bytes.NewReader(body)) if err != nil { return nil, err } result, err := c.doRequest(req) if err != nil { return nil, err } actual := Group{} err = json.Unmarshal(result, &actual) if err != nil { return nil, err } return &actual, nil } func generateKey(name string) string { return strings.Map(func(r rune) rune { if unicode.IsSpace(r) { return '_' } else if unicode.IsLetter(r) || unicode.IsNumber(r) { return unicode.ToUpper(r) } return -1 }, name) } func (c *Client) GetGroup(id string) (*Group, error) { req, err := http.NewRequest("GET", fmt.Sprintf("%s/userGroups/%s", c.RestURL, id), nil) if err != nil { return nil, err } resp, err := c.request(req) if err != nil { return nil, err } if resp.StatusCode == http.StatusNotFound { return nil, nil } actual := Group{} err = json.Unmarshal(resp.Body, &actual) if err != nil { return nil, err } return &actual, nil } func (c *Client) GetGroupByName(name string) (*Group, error) { encodedName := url.QueryEscape(name) req, err := http.NewRequest("GET", fmt.Sprintf("%s/userGroups/name:%s", c.RestURL, encodedName), nil) if err != nil { // If direct name lookup fails, fall back to listing all groups return nil, err } resp, err := c.request(req) if err != nil { return nil, err } if resp.StatusCode == http.StatusNotFound { return nil, errors.New("group not found") } var group Group err = json.Unmarshal(resp.Body, &group) if err != nil { return nil, err } return &group, nil } func (c *Client) DeleteGroup(id string) error { req, err := http.NewRequest("DELETE", fmt.Sprintf("%s/userGroups/%s", c.RestURL, id), nil) if err != nil { return err } _, err = c.doRequest(req) if err != nil { return err } return nil } func (c *Client) RemoveGroupRole(groupId, roleId, scope string) error { req, err := http.NewRequest("DELETE", fmt.Sprintf("%s/userGroups/%s/roles/%s/%s", c.RestURL, groupId, roleId, scope), nil) if err != nil { return err } _, err = c.doRequest(req) if err != nil { return err } return nil } func (c *Client) AddGroupRole(groupId, roleId, scope string) error { role := RoleAssignment{ Id: roleId, Scope: scope, } body, err := json.Marshal(role) if err != nil { return err } req, err := http.NewRequest("POST", fmt.Sprintf("%s/userGroups/%s/roles", c.RestURL, groupId), bytes.NewReader(body)) if err != nil { return err } _, err = c.doRequest(req) if err != nil { return err } return nil } func (c *Client) SetGroupParents(groupId string, parents []string) error { groups := ParentGroups{} for _, i := range parents { groups.Group = append(groups.Group, Group{Key: i}) } body, err := json.Marshal(groups) if err != nil { return err } req, err := http.NewRequest("PUT", fmt.Sprintf("%s/userGroups/%s/parent-groups", c.RestURL, groupId), bytes.NewReader(body)) if err != nil { return err } _, err = c.doRequest(req) if err != nil { return err } return nil } func (c *Client) AddGroupMember(groupId, username string) error { group := Group{ Key: groupId, } rb, err := json.Marshal(group) if err != nil { return err } req, err := http.NewRequest("POST", fmt.Sprintf("%s/users/username:%s/groups", c.RestURL, username), bytes.NewReader(rb)) if err != nil { return err } _, err = c.doRequest(req) if err != nil { return err } return nil } func (c *Client) CheckGroupMember(groupId, username string) (bool, error) { req, err := http.NewRequest("GET", fmt.Sprintf("%s/users/username:%s/groups/%s", c.RestURL, username, groupId), nil) if err != nil { return false, err } resp, err := c.request(req) if err != nil { return false, err } if resp.StatusCode == http.StatusNotFound { return false, nil } return true, nil } func (c *Client) DeleteGroupMember(groupId, username string) error { req, err := http.NewRequest("DELETE", fmt.Sprintf("%s/users/username:%s/groups/%s", c.RestURL, username, groupId), nil) if err != nil { return err } _, err = c.request(req) if err != nil { return err } return nil }