@@ -174,56 +174,72 @@ func (o *teamResourceType) Grants(ctx context.Context, resource *v2.Resource, pT
174174 return nil , "" , nil , err
175175 }
176176
177- opts := github.TeamListTeamMembersOptions {
178- ListOptions : github.ListOptions {
179- Page : page ,
180- PerPage : maxPageSize ,
181- },
182- }
183-
184- users , resp , err := o .client .Teams .ListTeamMembersByID (ctx , org .GetID (), githubID , & opts )
185- if err != nil {
186- if isNotFoundError (resp ) {
187- return nil , "" , nil , uhttp .WrapErrors (codes .NotFound , fmt .Sprintf ("org: %d not found" , org .GetID ()))
188- }
189- if isRatelimited (resp ) {
190- return nil , "" , nil , uhttp .WrapErrors (codes .Unavailable , "too many requests" , err )
177+ var (
178+ reqAnnos annotations.Annotations
179+ pageToken string
180+ rv = []* v2.Grant {}
181+ )
182+ switch rId := bag .ResourceTypeID (); rId {
183+ case resourceTypeTeam .Id :
184+ bag .Pop ()
185+ bag .Push (pagination.PageState {
186+ ResourceTypeID : teamRoleMember ,
187+ })
188+ bag .Push (pagination.PageState {
189+ ResourceTypeID : teamRoleMaintainer ,
190+ })
191+ case teamRoleMember , teamRoleMaintainer :
192+ opts := github.TeamListTeamMembersOptions {
193+ ListOptions : github.ListOptions {
194+ Page : page ,
195+ PerPage : maxPageSize ,
196+ },
197+ Role : rId ,
191198 }
192- return nil , "" , nil , fmt .Errorf ("github-connectorv2: failed to fetch team members: %w" , err )
193- }
194-
195- nextPage , reqAnnos , err := parseResp (resp )
196- if err != nil {
197- return nil , "" , nil , fmt .Errorf ("github-connectorv2: failed to parse response: %w" , err )
198- }
199-
200- pageToken , err := bag .NextToken (nextPage )
201- if err != nil {
202- return nil , "" , nil , err
203- }
204199
205- var rv []* v2.Grant
206- for _ , user := range users {
207- membership , _ , err := o .client .Teams .GetTeamMembershipByID (ctx , org .GetID (), githubID , user .GetLogin ())
200+ users , resp , err := o .client .Teams .ListTeamMembersByID (ctx , org .GetID (), githubID , & opts )
208201 if err != nil {
209202 if isNotFoundError (resp ) {
210- return nil , "" , nil , uhttp .WrapErrors (codes .NotFound , fmt .Sprintf ("user: %s not found" , user .GetLogin ()))
203+ return nil , "" , nil , uhttp .WrapErrors (codes .NotFound , fmt .Sprintf ("org: %d not found" , org .GetID ()))
204+ }
205+ if isRatelimited (resp ) {
206+ return nil , "" , nil , uhttp .WrapErrors (codes .Unavailable , "too many requests" , err )
211207 }
212- return nil , "" , nil , fmt .Errorf ("github-connectorv2: failed to get team membership for user: %w" , err )
208+ return nil , "" , nil , fmt .Errorf ("github-connectorv2: failed to fetch team members: %w" , err )
209+ }
210+
211+ var nextPage string
212+ nextPage , reqAnnos , err = parseResp (resp )
213+ if err != nil {
214+ return nil , "" , nil , fmt .Errorf ("github-connectorv2: failed to parse response: %w" , err )
213215 }
214216
215- ur , err := userResource ( ctx , user , user . GetEmail (), nil )
217+ err = bag . Next ( nextPage )
216218 if err != nil {
217219 return nil , "" , nil , err
218220 }
219221
220- rv = append (rv , grant .NewGrant (resource , membership .GetRole (), ur .Id ,
221- grant .WithAnnotation (& v2.V1Identifier {
222- Id : fmt .Sprintf ("team-grant:%s:%d:%s" , resource .Id .Resource , user .GetID (), membership .GetRole ()),
223- }),
224- ))
222+ for _ , user := range users {
223+ ur , err := userResource (ctx , user , user .GetEmail (), nil )
224+ if err != nil {
225+ return nil , "" , nil , err
226+ }
227+ rv = append (rv , grant .NewGrant (resource , rId , ur .Id ,
228+ grant .WithAnnotation (& v2.V1Identifier {
229+ Id : fmt .Sprintf ("team-grant:%s:%d:%s" , resource .Id .Resource , user .GetID (), rId ),
230+ }),
231+ ))
232+ }
233+ default :
234+ ctxzap .Extract (ctx ).Warn ("Unknown GitHub Role Name" ,
235+ zap .String ("role_name" , rId ),
236+ )
225237 }
226238
239+ pageToken , err = bag .Marshal ()
240+ if err != nil {
241+ return nil , "" , nil , err
242+ }
227243 return rv , pageToken , reqAnnos , nil
228244}
229245
0 commit comments