blob: 9be2f0694845a8a360e2f29c8328ae944abeb87a [file] [edit]
package gerrit
import (
"fmt"
"net/url"
)
// ProjectAccessInput describes changes that should be applied to a project access config
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#project-access-input
type ProjectAccessInput struct {
// A list of deductions to be applied to the project access as ProjectAccessInfo entities.
Remove map[string]AccessSectionInfo `json:"remove"`
// A list of additions to be applied to the project access as ProjectAccessInfo entities.
Add map[string]AccessSectionInfo `json:"add"`
// A commit message for this change.
Message string `json:"message"`
// A new parent for the project to inherit from. Changing the parent project requires administrative privileges.
Parent string `json:"parent"`
}
// AccessCheckInfo entity is the result of an access check.
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#access-check-info
type AccessCheckInfo struct {
// The HTTP status code for the access. 200 means success and 403 means denied.
Status int `json:"status"`
// A clarifying message if status is not 200.
Message string `json:"message"`
}
// CheckAccessOptions is options for check access
type CheckAccessOptions struct {
// The account for which to check access. Mandatory.
Account string `url:"account,omitempty"`
// The ref permission for which to check access. If not specified, read access to at least branch is checked.
Permission string `url:"perm,omitempty"`
// The branch for which to check access. This must be given if perm is specified.
Ref string `url:"ref,omitempty"`
}
// ListAccessRights lists the access rights for a single project
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-access
func (s *ProjectsService) ListAccessRights(projectName string) (*ProjectAccessInfo, *Response, error) {
u := fmt.Sprintf("projects/%s/access", url.QueryEscape(projectName))
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}
v := new(ProjectAccessInfo)
resp, err := s.client.Do(req, v)
if err != nil {
return nil, resp, err
}
return v, resp, err
}
// AddUpdateDeleteAccessRights add, update and delete access rights for project
//
// Sets access rights for the project using the diff schema provided by ProjectAccessInput.
// Deductions are used to remove access sections, permissions or permission rules.
// The backend will remove the entity with the finest granularity in the request,
// meaning that if an access section without permissions is posted, the access section will be removed;
// if an access section with a permission but no permission rules is posted, the permission will be removed;
// if an access section with a permission and a permission rule is posted, the permission rule will be removed.
//
// Additionally, access sections and permissions will be cleaned up after applying the deductions by
// removing items that have no child elements.
//
// After removals have been applied, additions will be applied.
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#set-access
func (s *ProjectsService) AddUpdateDeleteAccessRights(projectName string, input *ProjectAccessInput) (*ProjectAccessInfo, *Response, error) {
u := fmt.Sprintf("projects/%s/access", url.QueryEscape(projectName))
req, err := s.client.NewRequest("POST", u, input)
if err != nil {
return nil, nil, err
}
v := new(ProjectAccessInfo)
resp, err := s.client.Do(req, v)
if err != nil {
return nil, resp, err
}
return v, resp, err
}
// CreateAccessRightChange sets access rights for the project using the diff schema provided by ProjectAccessInput
//
// This takes the same input as Update Access Rights, but creates a pending change for review.
// Like Create Change, it returns a ChangeInfo entity describing the resulting change.
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#create-access-change
func (s *ProjectsService) CreateAccessRightChange(projectName string, input *ProjectAccessInput) (*ChangeInfo, *Response, error) {
u := fmt.Sprintf("projects/%s/access:review", url.QueryEscape(projectName))
req, err := s.client.NewRequest("PUT", u, input)
if err != nil {
return nil, nil, err
}
v := new(ChangeInfo)
resp, err := s.client.Do(req, v)
if err != nil {
return nil, resp, err
}
return v, resp, err
}
// CheckAccess runs access checks for other users. This requires the View Access global capability.
//
// The result is a AccessCheckInfo entity detailing the access of the given user for the given project, project-ref, or project-permission-ref combination.
//
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#check-access
func (s *ProjectsService) CheckAccess(projectName string, opt *CheckAccessOptions) (*AccessCheckInfo, *Response, error) {
u := fmt.Sprintf("projects/%s/check.access", url.QueryEscape(projectName))
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(AccessCheckInfo)
resp, err := s.client.Do(req, v)
if err != nil {
return nil, resp, err
}
return v, resp, err
}