blob: a83027b3b581c4f361c2e166a9d674e13390103e [file] [log] [blame]
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
}