Skip to content

Commit cd791e3

Browse files
committed
[INC-300] baton-github: optimize Grants() for org Resource
1 parent 206fc0d commit cd791e3

File tree

1 file changed

+32
-61
lines changed

1 file changed

+32
-61
lines changed

pkg/connector/org.go

Lines changed: 32 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -182,78 +182,49 @@ func (o *orgResourceType) Grants(
182182
resource *v2.Resource,
183183
pToken *pagination.Token,
184184
) ([]*v2.Grant, string, annotations.Annotations, error) {
185-
bag, page, err := parsePageToken(pToken.Token, resource.Id)
186-
if err != nil {
187-
return nil, "", nil, err
188-
}
189-
190-
opts := github.ListMembersOptions{
191-
ListOptions: github.ListOptions{
192-
Page: page,
193-
PerPage: maxPageSize,
194-
},
195-
}
196-
197185
orgName, err := o.orgCache.GetOrgName(ctx, resource.Id)
198186
if err != nil {
199187
return nil, "", nil, err
200188
}
201189

202-
users, resp, err := o.client.Organizations.ListMembers(ctx, orgName, &opts)
203-
if err != nil {
204-
if isNotFoundError(resp) {
205-
return nil, "", nil, uhttp.WrapErrors(codes.NotFound, fmt.Sprintf("org: %s not found", orgName))
206-
}
207-
errMsg := "github-connectorv2: failed to list org members"
208-
if isRatelimited(resp) {
209-
return nil, "", nil, uhttp.WrapErrors(codes.Unavailable, "too many requests", err)
210-
}
211-
return nil, "", nil, fmt.Errorf("%s: %w", errMsg, err)
212-
}
213-
214-
nextPage, reqAnnos, err := parseResp(resp)
215-
if err != nil {
216-
return nil, "", nil, fmt.Errorf("github-connectorv2: failed to parse response: %w", err)
217-
}
218-
219-
pageToken, err := bag.NextToken(nextPage)
220-
if err != nil {
221-
return nil, "", nil, err
222-
}
223-
224-
var rv []*v2.Grant
225-
for _, user := range users {
226-
membership, _, err := o.client.Organizations.GetOrgMembership(ctx, user.GetLogin(), orgName)
227-
if err != nil {
228-
return nil, "", nil, fmt.Errorf("github-connectorv2: failed to get org memberships for user: %w", err)
229-
}
230-
if membership.GetState() == "pending" {
231-
continue
232-
}
233-
234-
ur, err := userResource(ctx, user, user.GetEmail(), nil)
235-
if err != nil {
236-
return nil, "", nil, err
190+
rv := []*v2.Grant{}
191+
for _, role := range []string{orgRoleMember, orgRoleAdmin} {
192+
opts := github.ListMembersOptions{
193+
Role: role,
194+
ListOptions: github.ListOptions{
195+
Page: 0,
196+
PerPage: maxPageSize,
197+
},
237198
}
238199

239-
roleName := strings.ToLower(membership.GetRole())
240-
switch roleName {
241-
case orgRoleAdmin:
242-
rv = append(rv, o.orgRoleGrant(orgRoleAdmin, resource, ur.Id, user.GetID()))
243-
rv = append(rv, o.orgRoleGrant(orgRoleMember, resource, ur.Id, user.GetID()))
200+
for {
201+
users, resp, err := o.client.Organizations.ListMembers(ctx, orgName, &opts)
202+
if err != nil {
203+
if isNotFoundError(resp) {
204+
return nil, "", nil, uhttp.WrapErrors(codes.NotFound, fmt.Sprintf("org: %s not found", orgName))
205+
}
206+
errMsg := "github-connectorv2: failed to list org members"
207+
if isRatelimited(resp) {
208+
return nil, "", nil, uhttp.WrapErrors(codes.Unavailable, "too many requests", err)
209+
}
210+
return nil, "", nil, fmt.Errorf("%s: %w", errMsg, err)
211+
}
244212

245-
case orgRoleMember:
246-
rv = append(rv, o.orgRoleGrant(orgRoleMember, resource, ur.Id, user.GetID()))
213+
for _, user := range users {
214+
ur, err := userResource(ctx, user, user.GetEmail(), nil)
215+
if err != nil {
216+
return nil, "", nil, err
217+
}
218+
rv = append(rv, o.orgRoleGrant(role, resource, ur.Id, user.GetID()))
219+
}
247220

248-
default:
249-
ctxzap.Extract(ctx).Warn("Unknown GitHub Role Name",
250-
zap.String("role_name", roleName),
251-
zap.String("github_username", user.GetLogin()),
252-
)
221+
if resp.NextPage == 0 {
222+
break
223+
}
224+
opts.ListOptions.Page = resp.NextPage
253225
}
254226
}
255-
256-
return rv, pageToken, reqAnnos, nil
227+
return rv, "", nil, nil
257228
}
258229

259230
func (o *orgResourceType) Grant(ctx context.Context, principal *v2.Resource, en *v2.Entitlement) (annotations.Annotations, error) {

0 commit comments

Comments
 (0)