Public/Get-DuneActionAssignment.ps1

<#
.SYNOPSIS
Retrieve action assignments.

.DESCRIPTION
Gets action-assignment objects. Supports filtering by `Id`, `ConfigItemId`, `ConfigItemType`, and `IncludeReferencedObjects`.
#>

function Get-DuneActionAssignment {
    [CmdletBinding(DefaultParameterSetName='Default')]
    param(
        [Parameter(ParameterSetName='Deployment',ValueFromPipeline)]
        [DuneDeployment]$Deployment,

        [Parameter(ParameterSetName='ResourceGroup',ValueFromPipeline)]
        [DuneResourceGroup]$ResourceGroup,

        [Parameter(ParameterSetName='Resource',ValueFromPipeline)]
        [DuneResource]$Resource,

        [Parameter(ParameterSetName='Id')]
        [guid]$Id,

        [Parameter()]
        [string]$Name,

        [Parameter(ParameterSetName='Action')]
        [DuneAction]$Action,

        [Parameter(ParameterSetName='ByConfigItemType')]
        [ValidateSet('Deployment','ResourceGroup','VirtualMachine','PhysicalMachine')]
        [string]$ConfigItemType,

        [Parameter(ParameterSetName='ByScope')]
        [ActionScopes]$Scope,

        # [Parameter()]
        # [switch]$IncludeReferencedObjects,

        [Parameter()]
        [switch]$Raw
    )

    begin {
        Write-Debug "$($MyInvocation.MyCommand)|begin"
        $ReturnObjects = @()
        $ProcessedUrls = @()
        $BaseUri = 'action-assignments'
        $Method = 'GET'
    }

    process {
        Write-Debug "$($MyInvocation.MyCommand)|process|$($PSCmdlet.ParameterSetName)"

        $Uri = switch ($PSCmdlet.ParameterSetName) {
            'Id' { "{0}/{1}" -f $BaseUri, $Id }
            'Deployment' { $BaseUri | Add-UriQueryParam 'ConfigItemType=Deployment' | Add-UriQueryParam "ConfigItemId=$($Deployment.Id)" }
            'ResourceGroup' { $BaseUri | Add-UriQueryParam 'ConfigItemType=ResourceGroup' | Add-UriQueryParam "ConfigItemId=$($ResourceGroup.Id)" }
            'Resource' { $BaseUri | Add-UriQueryParam "ConfigItemType=$($Resource.ObjectType)" | Add-UriQueryParam "ConfigItemId=$($Resource.Id)" }
            'Action' { $BaseUri | Add-UriQueryParam "ActionId=$($Action.Id)" }
            'ByConfigItemType' { $BaseUri | Add-UriQueryParam "ConfigItemType=$($ConfigItemType)" }
            'ByScope' { $BaseUri | Add-UriQueryParam "Scope=$($Scope)" }
            Default { $BaseUri }
        }
        
        if ($PSBoundParameters.ContainsKey('Name')) { $Uri = $Uri | Add-UriQueryParam "NameILike=$Name" -ConvertWildcards }

        # if ($IncludeReferencedObjects) { $Uri = $Uri | Add-UriQueryParam 'IncludeReferencedObjects=1' }
        $Uri = $Uri | Add-UriQueryParam "IncludeReferencedObjects=1"

        if ($ProcessedUrls -notcontains $Uri) {
            $ResultItems = Invoke-DuneApiRequest -Uri $Uri -Method $Method -ExtractItems
            $ProcessedUrls += $Uri
            $ReturnObjects += $ResultItems | ForEach-Object {
                if ($Raw) { $_ } else { ConvertTo-DuneClassObject -Class DuneActionAssignment -InputObject $_ }
            }
        }
        else { Write-Debug "$($MyInvocation.MyCommand)|process|ApiCall Cache hit: $Uri" }
    }

    end { return $ReturnObjects }
}