@@ -260,76 +260,25 @@ func (r *permissionResource) grantPermission(ctx context.Context, subject permis
260260 return diags
261261}
262262
263- func (r * permissionResource ) Create (ctx context.Context , req resource.CreateRequest , resp * resource.CreateResponse ) {
264- // Retrieve values from plan.
265- var plan permissionsResourceModel
266- var planSubject permissionSubjectModel
267-
268- diags := req .Plan .Get (ctx , & plan )
269- resp .Diagnostics .Append (diags ... )
270- if resp .Diagnostics .HasError () {
271- return
272- }
273-
274- diags = plan .Subject .As (ctx , & planSubject , basetypes.ObjectAsOptions {})
275- resp .Diagnostics .Append (diags ... )
276- if resp .Diagnostics .HasError () {
277- return
278- }
279-
280- for _ , planPermission := range plan .Permissions {
281- diags = r .grantPermission (ctx , planSubject , planPermission )
282-
283- resp .Diagnostics .Append (diags ... )
284- if resp .Diagnostics .HasError () {
285- return
286- }
287- }
288-
289- // Set state to fully populated data.
290- diags = resp .State .Set (ctx , plan )
291- resp .Diagnostics .Append (diags ... )
292- if resp .Diagnostics .HasError () {
293- tflog .Error (ctx , "Error creating permissions" , map [string ]interface {}{"error" : "Could not set state" })
294- return
295- }
296- }
297-
298- func (r * permissionResource ) Read (ctx context.Context , req resource.ReadRequest , resp * resource.ReadResponse ) {
299- var state permissionsResourceModel
300-
301- diags := req .State .Get (ctx , & state )
302- resp .Diagnostics .Append (diags ... )
303- if resp .Diagnostics .HasError () {
304- return
305- }
306-
307- var stateSubject permissionSubjectModel
308-
309- diags = state .Subject .As (ctx , & stateSubject , basetypes.ObjectAsOptions {})
310- resp .Diagnostics .Append (diags ... )
311- if resp .Diagnostics .HasError () {
312- return
313- }
314-
263+ func (r * permissionResource ) fetchPermissionsForSubject (ctx context.Context , subject permissionSubjectModel ) ([]permissionModel , diag.Diagnostics ) {
315264 var permissions []permissionModel
265+ var allDiags diag.Diagnostics
316266
317- subjectID := stateSubject .ID .ValueString () + "|" + stateSubject .Type .ValueString ()
267+ subjectID := subject .ID .ValueString () + "|" + subject .Type .ValueString ()
318268
319- // We'll need to get all the permissions for the given subject.
320269 for _ , objectType := range []string {"app" , "folder" , "resource" , "resource_configuration" } {
321- request := api .NewPermissionsListObjectsPostRequest (createNewAPIPermissionsSubject (stateSubject ), objectType )
270+ request := api .NewPermissionsListObjectsPostRequest (createNewAPIPermissionsSubject (subject ), objectType )
322271
323- tflog .Info (ctx , "Reading permission " , map [string ]interface {}{"subjectId" : subjectID })
272+ tflog .Info (ctx , "Fetching permissions " , map [string ]interface {}{"subjectId" : subjectID , "objectType" : objectType })
324273
325274 permissionsResponse , httpResponse , err := r .client .PermissionsAPI .PermissionsListObjectsPost (ctx ).PermissionsListObjectsPostRequest (* request ).Execute ()
326275 if err != nil {
327- resp . Diagnostics .AddError (
276+ allDiags .AddError (
328277 "Error reading permission" ,
329278 fmt .Sprintf ("Could not read permissions for id: %s, object type: %s, error: %s" , subjectID , objectType , err .Error ()),
330279 )
331280 tflog .Error (ctx , "Error reading group" , utils .AddHTTPStatusCode (map [string ]any {"permissionId" : subjectID , "objectType" : objectType , "error" : err .Error ()}, httpResponse ))
332- return
281+ return nil , allDiags
333282 }
334283
335284 // Now let's populate the state with permissions based on our API response.
@@ -372,18 +321,103 @@ func (r *permissionResource) Read(ctx context.Context, req resource.ReadRequest,
372321 Type : types .StringValue (objectType ),
373322 }
374323 object , diags := types .ObjectValueFrom (ctx , objValue .AttributeTypes (), objValue )
375- resp . Diagnostics .Append (diags ... )
376- if resp . Diagnostics .HasError () {
377- return
324+ allDiags .Append (diags ... )
325+ if allDiags .HasError () {
326+ return nil , allDiags
378327 }
379328 permissions = append (permissions , permissionModel {
380329 Object : object ,
381330 AccessLevel : types .StringValue (accessLevel ),
382331 })
383332 }
384333 }
334+ return permissions , allDiags
335+ }
385336
386- state .Permissions = permissions
337+ func (r * permissionResource ) Create (ctx context.Context , req resource.CreateRequest , resp * resource.CreateResponse ) {
338+ // Retrieve values from plan.
339+ var plan permissionsResourceModel
340+ var planSubject permissionSubjectModel
341+
342+ diags := req .Plan .Get (ctx , & plan )
343+ resp .Diagnostics .Append (diags ... )
344+ if resp .Diagnostics .HasError () {
345+ return
346+ }
347+
348+ diags = plan .Subject .As (ctx , & planSubject , basetypes.ObjectAsOptions {})
349+ resp .Diagnostics .Append (diags ... )
350+ if resp .Diagnostics .HasError () {
351+ return
352+ }
353+
354+ for _ , planPermission := range plan .Permissions {
355+ diags = r .grantPermission (ctx , planSubject , planPermission )
356+
357+ resp .Diagnostics .Append (diags ... )
358+ if resp .Diagnostics .HasError () {
359+ return
360+ }
361+ }
362+
363+ // Set state to fully populated data.
364+ diags = resp .State .Set (ctx , plan )
365+ resp .Diagnostics .Append (diags ... )
366+ if resp .Diagnostics .HasError () {
367+ tflog .Error (ctx , "Error creating permissions" , map [string ]interface {}{"error" : "Could not set state" })
368+ return
369+ }
370+ }
371+
372+ func (r * permissionResource ) Read (ctx context.Context , req resource.ReadRequest , resp * resource.ReadResponse ) {
373+ var state permissionsResourceModel
374+
375+ diags := req .State .Get (ctx , & state )
376+ resp .Diagnostics .Append (diags ... )
377+ if resp .Diagnostics .HasError () {
378+ return
379+ }
380+
381+ var stateSubject permissionSubjectModel
382+ var managedPermissionKeys = make (map [string ]bool )
383+
384+ for _ , permission := range state .Permissions {
385+ var obj permissionObjectModel
386+ diags := permission .Object .As (ctx , & obj , basetypes.ObjectAsOptions {})
387+ if diags .HasError () {
388+ return
389+ }
390+ key := obj .ID .ValueString () + "|" + obj .Type .ValueString ()
391+ managedPermissionKeys [key ] = true
392+ }
393+
394+ diags = state .Subject .As (ctx , & stateSubject , basetypes.ObjectAsOptions {})
395+ resp .Diagnostics .Append (diags ... )
396+ if resp .Diagnostics .HasError () {
397+ return
398+ }
399+
400+ allPermissions , diags := r .fetchPermissionsForSubject (ctx , stateSubject )
401+ resp .Diagnostics .Append (diags ... )
402+ if resp .Diagnostics .HasError () {
403+ return
404+ }
405+
406+ var filteredPermissions []permissionModel
407+ for _ , perm := range allPermissions {
408+ var obj permissionObjectModel
409+ diags := perm .Object .As (ctx , & obj , basetypes.ObjectAsOptions {})
410+ if diags .HasError () {
411+ resp .Diagnostics .Append (diags ... )
412+ return
413+ }
414+ key := obj .ID .ValueString () + "|" + obj .Type .ValueString ()
415+ if managedPermissionKeys [key ] {
416+ filteredPermissions = append (filteredPermissions , perm )
417+ }
418+ }
419+
420+ state .Permissions = filteredPermissions
387421
388422 diags = resp .State .Set (ctx , & state )
389423 resp .Diagnostics .Append (diags ... )
@@ -548,4 +582,11 @@ func (r *permissionResource) ImportState(ctx context.Context, req resource.Impor
548582 Type : types .StringValue (subjType ),
549583 }
550584 resp .State .SetAttribute (ctx , path .Root ("subject" ), subject )
585+
586+ allPermissions , diags := r .fetchPermissionsForSubject (ctx , subject )
587+ resp .Diagnostics .Append (diags ... )
588+ if resp .Diagnostics .HasError () {
589+ return
590+ }
591+ resp .State .SetAttribute (ctx , path .Root ("permissions" ), allPermissions )
551592}
0 commit comments