Skip to content

Commit b346dec

Browse files
authored
feat: Add support for repository fine-grained permissions (#4032)
1 parent cb616af commit b346dec

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

github/orgs_custom_repository_roles.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ type CreateOrUpdateCustomRepoRoleOptions struct {
3838
Permissions []string `json:"permissions"`
3939
}
4040

41+
// RepoFineGrainedPermission represents a fine-grained permission that can be used in a custom repository role.
42+
type RepoFineGrainedPermission struct {
43+
Name string `json:"name"`
44+
Description string `json:"description"`
45+
}
46+
4147
// ListCustomRepoRoles lists the custom repository roles available in this organization.
4248
// In order to see custom repository roles in an organization, the authenticated user must be an organization owner.
4349
//
@@ -152,3 +158,26 @@ func (s *OrganizationsService) DeleteCustomRepoRole(ctx context.Context, org str
152158

153159
return resp, nil
154160
}
161+
162+
// ListRepositoryFineGrainedPermissions lists the fine-grained permissions that can be used in custom repository roles for an organization.
163+
// The authenticated user must be an administrator of the organization or of a repository of the organization to use this endpoint.
164+
//
165+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/custom-roles#list-repository-fine-grained-permissions-for-an-organization
166+
//
167+
//meta:operation GET /orgs/{org}/repository-fine-grained-permissions
168+
func (s *OrganizationsService) ListRepositoryFineGrainedPermissions(ctx context.Context, org string) ([]*RepoFineGrainedPermission, *Response, error) {
169+
u := fmt.Sprintf("orgs/%v/repository-fine-grained-permissions", org)
170+
171+
req, err := s.client.NewRequest("GET", u, nil)
172+
if err != nil {
173+
return nil, nil, err
174+
}
175+
176+
var perms []*RepoFineGrainedPermission
177+
resp, err := s.client.Do(ctx, req, &perms)
178+
if err != nil {
179+
return nil, resp, err
180+
}
181+
182+
return perms, resp, nil
183+
}

github/orgs_custom_repository_roles_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,3 +283,56 @@ func TestOrganizationsService_DeleteCustomRepoRole(t *testing.T) {
283283
return err
284284
})
285285
}
286+
287+
func TestOrganizationsService_ListRepositoryFineGrainedPermissions(t *testing.T) {
288+
t.Parallel()
289+
client, mux, _ := setup(t)
290+
291+
mux.HandleFunc("/orgs/o/repository-fine-grained-permissions", func(w http.ResponseWriter, r *http.Request) {
292+
testMethod(t, r, "GET")
293+
fmt.Fprint(w, `[
294+
{
295+
"name": "add_assignee",
296+
"description": "Assign or remove a user"
297+
},
298+
{
299+
"name": "add_label",
300+
"description": "Add or remove a label"
301+
}
302+
]`)
303+
})
304+
305+
ctx := t.Context()
306+
perms, _, err := client.Organizations.ListRepositoryFineGrainedPermissions(ctx, "o")
307+
if err != nil {
308+
t.Errorf("Organizations.ListRepositoryFineGrainedPermissions returned error: %v", err)
309+
}
310+
311+
want := []*RepoFineGrainedPermission{
312+
{
313+
Name: "add_assignee",
314+
Description: "Assign or remove a user",
315+
},
316+
{
317+
Name: "add_label",
318+
Description: "Add or remove a label",
319+
},
320+
}
321+
if !cmp.Equal(perms, want) {
322+
t.Errorf("Organizations.ListRepositoryFineGrainedPermissions returned %+v, want %+v", perms, want)
323+
}
324+
325+
const methodName = "ListRepositoryFineGrainedPermissions"
326+
testBadOptions(t, methodName, func() (err error) {
327+
_, _, err = client.Organizations.ListRepositoryFineGrainedPermissions(ctx, "\no")
328+
return err
329+
})
330+
331+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
332+
got, resp, err := client.Organizations.ListRepositoryFineGrainedPermissions(ctx, "o")
333+
if got != nil {
334+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
335+
}
336+
return resp, err
337+
})
338+
}

0 commit comments

Comments
 (0)