package gerrit import ( "fmt" ) // GroupsService contains Group related REST endpoints // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html type GroupsService struct { client *Client } // GroupAuditEventInfo entity contains information about an audit event of a group. type GroupAuditEventInfo struct { // TODO Member AccountInfo OR GroupInfo `json:"member"` Type string `json:"type"` User AccountInfo `json:"user"` Date Timestamp `json:"date"` } // GroupInfo entity contains information about a group. // This can be a Gerrit internal group, or an external group that is known to Gerrit. type GroupInfo struct { ID string `json:"id"` Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` Options GroupOptionsInfo `json:"options"` Description string `json:"description,omitempty"` GroupID int `json:"group_id,omitempty"` Owner string `json:"owner,omitempty"` OwnerID string `json:"owner_id,omitempty"` CreatedOn *Timestamp `json:"created_on,omitempty"` Members []AccountInfo `json:"members,omitempty"` Includes []GroupInfo `json:"includes,omitempty"` } // GroupInput entity contains information for the creation of a new internal group. type GroupInput struct { Name string `json:"name,omitempty"` Description string `json:"description,omitempty"` VisibleToAll bool `json:"visible_to_all,omitempty"` OwnerID string `json:"owner_id,omitempty"` } // GroupOptionsInfo entity contains options of the group. type GroupOptionsInfo struct { VisibleToAll bool `json:"visible_to_all,omitempty"` } // GroupOptionsInput entity contains new options for a group. type GroupOptionsInput struct { VisibleToAll bool `json:"visible_to_all,omitempty"` } // GroupsInput entity contains information about groups that should be included into a group or that should be deleted from a group. type GroupsInput struct { OneGroup string `json:"_one_group,omitempty"` Groups []string `json:"groups,omitempty"` } // ListGroupsOptions specifies the different options for the ListGroups call. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#list-groups type ListGroupsOptions struct { // Group Options // Options fields can be obtained by adding o parameters, each option requires more lookups and slows down the query response time to the client so they are generally disabled by default. // Optional fields are: // INCLUDES: include list of directly included groups. // MEMBERS: include list of direct group members. Options []string `url:"o,omitempty"` // Check if a group is owned by the calling user // By setting the option owned and specifying a group to inspect with the option q, it is possible to find out, if this group is owned by the calling user. // If the group is owned by the calling user, the returned map contains this group. If the calling user doesn’t own this group an empty map is returned. Owned string `url:"owned,omitempty"` Group string `url:"q,omitempty"` // Group Limit // The /groups/ URL also accepts a limit integer in the n parameter. This limits the results to show n groups. Limit int `url:"n,omitempty"` // The /groups/ URL also accepts a start integer in the S parameter. The results will skip S groups from group list. Skip int `url:"S,omitempty"` } // ListGroups lists the groups accessible by the caller. // This is the same as using the ls-groups command over SSH, and accepts the same options as query parameters. // The entries in the map are sorted by group name. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#list-groups func (s *GroupsService) ListGroups(opt *ListGroupsOptions) (*map[string]GroupInfo, *Response, error) { u := "groups/" u, err := addOptions(u, opt) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } v := new(map[string]GroupInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // GetGroup retrieves a group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group func (s *GroupsService) GetGroup(groupID string) (*GroupInfo, *Response, error) { u := fmt.Sprintf("groups/%s", groupID) return s.getGroupInfoResponse(u) } // GetGroupDetail retrieves a group with the direct members and the directly included groups. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group-detail func (s *GroupsService) GetGroupDetail(groupID string) (*GroupInfo, *Response, error) { u := fmt.Sprintf("groups/%s/detail", groupID) return s.getGroupInfoResponse(u) } // getGroupInfoResponse retrieved a single GroupInfo Response for a GET request func (s *GroupsService) getGroupInfoResponse(u string) (*GroupInfo, *Response, error) { req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } v := new(GroupInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // GetGroupName retrieves the name of a group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group-name func (s *GroupsService) GetGroupName(groupID string) (string, *Response, error) { u := fmt.Sprintf("groups/%s/name", groupID) return getStringResponseWithoutOptions(s.client, u) } // GetGroupDescription retrieves the description of a group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group-description func (s *GroupsService) GetGroupDescription(groupID string) (string, *Response, error) { u := fmt.Sprintf("groups/%s/description", groupID) return getStringResponseWithoutOptions(s.client, u) } // GetGroupOptions retrieves the options of a group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group-options func (s *GroupsService) GetGroupOptions(groupID string) (*GroupOptionsInfo, *Response, error) { u := fmt.Sprintf("groups/%s/options", groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } v := new(GroupOptionsInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // GetGroupOwner retrieves the owner group of a Gerrit internal group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-group-owner func (s *GroupsService) GetGroupOwner(groupID string) (*GroupInfo, *Response, error) { u := fmt.Sprintf("groups/%s/owner", groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } v := new(GroupInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // GetAuditLog gets the audit log of a Gerrit internal group. // The returned audit events are sorted by date in reverse order so that the newest audit event comes first. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#get-audit-log func (s *GroupsService) GetAuditLog(groupID string) (*[]GroupAuditEventInfo, *Response, error) { u := fmt.Sprintf("groups/%s/log.audit", groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } v := new([]GroupAuditEventInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // CreateGroup creates a new Gerrit internal group. // In the request body additional data for the group can be provided as GroupInput. // // As response the GroupInfo entity is returned that describes the created group. // If the group creation fails because the name is already in use the response is “409 Conflict”. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#create-group func (s *GroupsService) CreateGroup(groupID string, input *GroupInput) (*GroupInfo, *Response, error) { u := fmt.Sprintf("groups/%s", groupID) req, err := s.client.NewRequest("PUT", u, input) if err != nil { return nil, nil, err } v := new(GroupInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // RenameGroup renames a Gerrit internal group. // The new group name must be provided in the request body. // // As response the new group name is returned. // If renaming the group fails because the new name is already in use the response is “409 Conflict”. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#rename-group func (s *GroupsService) RenameGroup(groupID, name string) (*string, *Response, error) { u := fmt.Sprintf("groups/%s/name", groupID) input := struct { Name string `json:"name"` }{ Name: name, } req, err := s.client.NewRequest("PUT", u, input) if err != nil { return nil, nil, err } v := new(string) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // SetGroupDescription sets the description of a Gerrit internal group. // The new group description must be provided in the request body. // // As response the new group description is returned. // If the description was deleted the response is “204 No Content”. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#set-group-description func (s *GroupsService) SetGroupDescription(groupID, description string) (*string, *Response, error) { u := fmt.Sprintf("groups/%s/description", groupID) input := struct { Description string `json:"description"` }{ Description: description, } req, err := s.client.NewRequest("PUT", u, input) if err != nil { return nil, nil, err } v := new(string) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // DeleteGroupDescription deletes the description of a Gerrit internal group. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#delete-group-description func (s *GroupsService) DeleteGroupDescription(groupID string) (*Response, error) { u := fmt.Sprintf("groups/%s/description'", groupID) return s.client.DeleteRequest(u, nil) } // SetGroupOptions sets the options of a Gerrit internal group. // The new group options must be provided in the request body as a GroupOptionsInput entity. // // As response the new group options are returned as a GroupOptionsInfo entity. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#set-group-options func (s *GroupsService) SetGroupOptions(groupID string, input *GroupOptionsInput) (*GroupOptionsInfo, *Response, error) { u := fmt.Sprintf("groups/%s/options", groupID) req, err := s.client.NewRequest("PUT", u, input) if err != nil { return nil, nil, err } v := new(GroupOptionsInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err } // SetGroupOwner sets the owner group of a Gerrit internal group. // The new owner group must be provided in the request body. // The new owner can be specified by name, by group UUID or by the legacy numeric group ID. // // Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#set-group-owner func (s *GroupsService) SetGroupOwner(groupID, owner string) (*GroupInfo, *Response, error) { u := fmt.Sprintf("groups/%s/owner", groupID) input := struct { Owner string `json:"owner"` }{ Owner: owner, } req, err := s.client.NewRequest("PUT", u, input) if err != nil { return nil, nil, err } v := new(GroupInfo) resp, err := s.client.Do(req, v) if err != nil { return nil, resp, err } return v, resp, err }