@@ -228,18 +228,28 @@ func (r *roleResourceType) Grant(ctx context.Context, principal *v2.Resource, en
228228 return nil , fmt .Errorf ("baton-cloudflare: only users can be granted role membership" )
229229 }
230230
231- memberId , err := getMemberId ( ctx , r , userId )
231+ userTrait , err := rs . GetUserTrait ( principal )
232232 if err != nil {
233- return nil , err
233+ return nil , fmt .Errorf ("baton-cloudflare: user trait not found on principal" )
234+ }
235+
236+ memberId , found := rs .GetProfileStringValue (userTrait .GetProfile (), memberIdProfileKey )
237+ if ! found || memberId == "" {
238+ memberId , err = getMemberId (ctx , r , userId )
239+ if err != nil {
240+ return nil , err
241+ }
234242 }
235243
236244 account , err := r .GetAccountMember (ctx , r .accountId , memberId )
237245 if err != nil {
238246 return nil , fmt .Errorf ("error: %s" , err .Error ())
239247 }
240248
241- roles := []cloudflare.AccountRole {{
242- ID : roleId },
249+ roles := []cloudflare.AccountRole {
250+ {
251+ ID : roleId ,
252+ },
243253 }
244254 for _ , role := range account .Result .Roles {
245255 if role .ID == roleId {
@@ -248,7 +258,7 @@ func (r *roleResourceType) Grant(ctx context.Context, principal *v2.Resource, en
248258 zap .String ("principal_id" , principal .Id .String ()),
249259 zap .String ("principal_type" , principal .Id .ResourceType ),
250260 )
251- return nil , fmt . Errorf ( "cloudflare-connector: user %s already has this role" , principal . DisplayName )
261+ return annotations . New ( & v2. GrantAlreadyExists {}), nil
252262 }
253263
254264 roles = append (roles , cloudflare.AccountRole {
@@ -350,18 +360,34 @@ func (r *roleResourceType) UpdateAccountMember(ctx context.Context, accountID, m
350360}
351361
352362func getMemberId (ctx context.Context , r * roleResourceType , userId string ) (string , error ) {
353- memberUsers , _ , err := r .client .AccountMembers (ctx , r .accountId , cloudflare.PaginationOptions {})
354- if err != nil {
355- return "" , wrapError (err , "failed to list user members" )
356- }
363+ processedMemberCount := 0
364+ perPage := 50
365+ page := 1
366+
367+ for {
368+ memberUsers , resp , err := r .client .AccountMembers (ctx , r .accountId , cloudflare.PaginationOptions {
369+ Page : page ,
370+ PerPage : perPage ,
371+ })
372+ if err != nil {
373+ return "" , wrapError (err , "failed to list user members" )
374+ }
357375
358- for _ , memberUser := range memberUsers {
359- if memberUser .User .ID == userId {
360- return memberUser .ID , nil
376+ for _ , memberUser := range memberUsers {
377+ if memberUser .User .ID == userId {
378+ return memberUser .ID , nil
379+ }
380+ }
381+
382+ processedMemberCount += perPage
383+ if processedMemberCount >= resp .Total {
384+ break
361385 }
386+
387+ page ++
362388 }
363389
364- return "" , nil
390+ return "" , fmt . Errorf ( "cloudflare-connector: account member not found for user with id: %s" , userId )
365391}
366392
367393func (r * roleResourceType ) Revoke (ctx context.Context , grant * v2.Grant ) (annotations.Annotations , error ) {
@@ -379,9 +405,18 @@ func (r *roleResourceType) Revoke(ctx context.Context, grant *v2.Grant) (annotat
379405
380406 userId := principal .Id .Resource
381407 roleId := entitlement .Resource .Id .Resource
382- memberId , err := getMemberId (ctx , r , userId )
408+
409+ userTrait , err := rs .GetUserTrait (principal )
383410 if err != nil {
384- return nil , err
411+ return nil , fmt .Errorf ("baton-cloudflare: user trait not found on principal" )
412+ }
413+
414+ memberId , found := rs .GetProfileStringValue (userTrait .GetProfile (), memberIdProfileKey )
415+ if ! found || memberId == "" {
416+ memberId , err = getMemberId (ctx , r , userId )
417+ if err != nil {
418+ return nil , err
419+ }
385420 }
386421
387422 account , err := r .GetAccountMember (ctx , r .accountId , memberId )
@@ -407,7 +442,7 @@ func (r *roleResourceType) Revoke(ctx context.Context, grant *v2.Grant) (annotat
407442 zap .String ("principal_id" , principal .Id .String ()),
408443 zap .String ("principal_type" , principal .Id .ResourceType ),
409444 )
410- return nil , fmt . Errorf ( "cloudflare-connector: user %s does not have this role" , principal . DisplayName )
445+ return annotations . New ( & v2. GrantAlreadyRevoked {}), nil
411446 }
412447
413448 member , err := r .UpdateAccountMember (ctx , r .accountId , memberId , cloudflare.AccountMember {
0 commit comments