Public/Get-DuneAction.ps1

<#
.SYNOPSIS
Retrieve actions.

.DESCRIPTION
Gets action objects. Supports filtering by `Id`, `Name`, and configuration item context. Use `-Raw` to return raw API objects.
#>

function Get-DuneAction {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param(
        [Parameter(Position=0)]
        [string]$Name,

        [Parameter()]
        [string]$DisplayName,

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

        [Parameter(ParameterSetName='ActionAssignment', ValueFromPipeline)]
        [DuneActionAssignment]$ActionAssignment,

        [Parameter()]
        [ActionScopes]$Scope,

        [Parameter()]
        [switch]$IncludeReferencedObjects,

        [Parameter()]
        [switch]$Raw,

        [Parameter()]
        [switch]$IncludeDeleted
    )

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

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

        $Uri = switch ($PSCmdlet.ParameterSetName) {
            'Id' { "{0}/{1}" -f $BaseUri, $Id }
            'ActionAssignment' { "{0}/{1}" -f $BaseUri, $ActionAssignment.ActionId }
            'Name' { $BaseUri | Add-UriQueryParam 'N' }
            Default { $BaseUri }
        }

        if ($PSBoundParameters.ContainsKey('Name')) { $Uri = $Uri | Add-UriQueryParam "NameILike=$Name" -ConvertWildcards }
        if ($PSBoundParameters.ContainsKey('DisplayName')) { $Uri = $Uri | Add-UriQueryParam "DisplayNameILike=$DisplayName" -ConvertWildcards }
        if ($PSBoundParameters.ContainsKey('Scope')) { $Uri = $Uri | Add-UriQueryParam "Scope=$Scope" -ConvertWildcards }
        if ($IncludeReferencedObjects) { $Uri = $Uri | Add-UriQueryParam 'IncludeReferencedObjects=1' }
        if ($IncludeDeleted) { $Uri = $Uri | Add-UriQueryParam "IncludeDeleted=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 DuneAction -InputObject $_ }
            }
        }
        else { Write-Debug "$($MyInvocation.MyCommand)|process|ApiCall Cache hit: $Uri" }
    }

    end { return $ReturnObjects }
}