@@ -20,6 +20,7 @@ import (
2020type userResourceType struct {
2121 resourceType * v2.ResourceType
2222 client * client.Client
23+ usersCache * usersCache
2324 managers map [string ]* jcapi1.Systemuserreturn
2425}
2526
@@ -32,6 +33,7 @@ func newUserBuilder(client *client.Client) *userResourceType {
3233 resourceType : resourceTypeUser ,
3334 client : client ,
3435 managers : make (map [string ]* jcapi1.Systemuserreturn ),
36+ usersCache : newUsersCache (client ),
3537 }
3638}
3739
@@ -103,6 +105,12 @@ func (o *userResourceType) List(ctx context.Context, parentResourceID *v2.Resour
103105 return nil , nil , fmt .Errorf ("failed to list system users: %w" , err )
104106 }
105107
108+ // populate the users cache with the system users
109+ err = o .usersCache .SetSystemUsers (ctx , opts .Session , systemUsers )
110+ if err != nil {
111+ return nil , nil , err
112+ }
113+
106114 for i := range systemUsers {
107115 ur , err := o .userResource (ctx , & systemUsers [i ])
108116 if err != nil {
@@ -121,6 +129,14 @@ func (o *userResourceType) List(ctx context.Context, parentResourceID *v2.Resour
121129 return nil , nil , fmt .Errorf ("failed to list admin users: %w" , err )
122130 }
123131
132+ adminEmails := make ([]string , len (adminUsers ))
133+ for i := range adminUsers {
134+ adminEmails [i ] = adminUsers [i ].GetEmail ()
135+ }
136+ systemUsersMap , err := o .usersCache .GetSystemUsersByEmailList (ctx , opts .Session , adminEmails )
137+ if err != nil {
138+ return nil , nil , err
139+ }
124140 for i := range adminUsers {
125141 adminEmail := adminUsers [i ].GetEmail ()
126142 adminUser , err := o .adminUserResource (& adminUsers [i ])
@@ -129,14 +145,12 @@ func (o *userResourceType) List(ctx context.Context, parentResourceID *v2.Resour
129145 }
130146
131147 // Check if the admin user is also a system user, if so we'll use that user instead
132- // TODO (luisina) > use a cache to store user by email, to avoid making multiple requests to the API
133- systemUser , err := o .client .FetchUserByEmail (ctx , adminEmail )
134- if err != nil && ! strings .Contains (err .Error (), codes .NotFound .String ()) {
135- return nil , nil , err
136- }
137-
138- if systemUser != nil {
139- continue
148+ if systemUser , ok := systemUsersMap [adminEmail ]; ok {
149+ if systemUser != nil {
150+ continue
151+ } else {
152+ return nil , nil , err
153+ }
140154 }
141155
142156 l .Debug ("admin user not found as system user, creating" , zap .String ("email" , adminEmail ))
0 commit comments