Public/Get-DuneDeploymentTemplate.ps1

function Get-DuneDeploymentTemplate {
    [CmdletBinding(DefaultParameterSetName = "Default")]
    param (
        [Parameter(ParameterSetName = "Name", Mandatory, Position = 0)]
        [string]$Name,

        [Parameter(ParameterSetName = "Name", Position = 1)]
        [string]$Version,

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

        [Parameter(ParameterSetName = "Deployment", ValueFromPipeline)]
        [DuneDeployment]$Deployment,

        [Parameter()]
        [switch]$Raw,

        [Parameter()]
        [switch]$IncludeDefinition,

        [Parameter()]
        [switch]$IncludeDeleted,

        [Parameter()]
        [switch]$Latest
    )

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

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

        # Build Uri
        switch ($PSCmdlet.ParameterSetName) {
            'Id' { $Uri = '{0}/{1}' -f $BaseUri, $Id }
            'Name' {
                $Uri = $BaseUri | Add-UriQueryParam "NameILike=$Name" -ConvertWildcards
                if ($Version) { $Uri = $Uri | Add-UriQueryParam "VersionILike=$Version" -ConvertWildcards }
            }
            'Deployment' {
                if ($Deployment.Template) {
                    return $Deployment.Template
                }
                else {
                    if ($Deployment.TemplateId) {
                        $Uri = '{0}/{1}' -f $BaseUri, $Deployment.TemplateId
                    }
                    else {
                        throw "TemplateId not set on Deployment $($Deployment.Name) (Id: $($Deployment.Id))"
                    }
                }
            }
            Default { $Uri = $BaseUri }
        }
        if ($PSCmdlet.ParameterSetName -in ('Id', 'Deployment')) {
            $Uri = $Uri | Add-UriQueryParam "IncludeDefinition=1"
            $Uri = $Uri | Add-UriQueryParam "IncludeReferencedObjects=1"
        }
        if ($IncludeDeleted) {
            $Uri = $Uri | Add-UriQueryParam "IncludeDeleted=1"
        }

        # ApiCall Cache
        if ($ProcessedUrls -notcontains $Uri) {
            try {
                # ApiCall and Object conversion
                $ResultItems = Invoke-DuneApiRequest -Uri $Uri -Method $Method -ExtractItems
                $ProcessedUrls += $Uri
                $ReturnObjects += $ResultItems | ForEach-Object {
                    if ($Raw) {
                        $_
                    }
                    else {
                        if (-not $uri.Contains('/')) {
                            if ($IncludeDefinition) { Get-DuneDeploymentTemplate -Id $_.Id }
                            else { ConvertTo-DuneClassObject -Class DuneDeploymentTemplate -InputObject $_ }
                        }
                        else {
                            ConvertTo-DuneClassObject -Class DuneDeploymentTemplate -InputObject $_
                        }
                    }
                }
            }
            catch {
                throw $_
            }
        }
        else {
            Write-Debug "$($MyInvocation.MyCommand)|process|ApiCall Cache hit: DuneApiRequest for $Uri already invoked"
        }
    }

    end {
        Write-Debug "$($MyInvocation.MyCommand)|end"
        if ($uri -and -not $uri.Contains('/') -and -not $Raw) {
            if ($IncludeDefinition) {
                $ReturnObjects | ForEach-Object {
                    $_.Definition = ((Invoke-DuneApiRequest -Uri "$BaseUri/$($_.Id)/definition" -Method 'GET').Content | ConvertFrom-Json).Definition
                }
            }
            else {
                Write-Warning "Slimmed down objects are returned. Please specify IncludeDefinition param to show full objects (Definition, AllowedResourceProviders, ResourceGroupTemplates)"
            }
        }
        $ReturnObjects = $ReturnObjects | Sort-Object -Unique Id | Sort-Object -Property Name, Version
        if ($Latest) {
            $ReturnObjects = Foreach ($Name in ($ReturnObjects | Select Name -Unique).Name){
                $ReturnObjects | ? Name -in $Name | Sort-Object Version | Select -Last 1
            }
        }
        return $ReturnObjects
    }
}