| 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 |
| } |