AL/Download-Symbols.ps1

function Download-Symbols {
    Param(
        [Parameter(Mandatory=$false)]
        [string]$SourcePath = (Get-Location),
        [Parameter(Mandatory=$false)]
        [string]$ContainerName = (Get-ContainerFromLaunchJson),
        # optionally download the test symbols
        [Parameter(Mandatory=$false)]
        [switch]
        $includeTestSymbols
    )

    $PackagesPath = Join-Path $SourcePath '.alpackages'

    if (!(Test-Path $PackagesPath)) {
        Create-EmptyDirectory $PackagesPath
    }

    [version]$BCFallPlatform = '15.0.0.0'
    [version]$platform = Get-BcContainerPlatformVersion -containerOrImageName $ContainerName
    if ($platform -ge $BCFallPlatform) {
        $ServerInstance = 'bc'
    } else {
        $ServerInstance = 'nav'
    }

    $Version = '{0}.0.0.0' -f $platform.Major

    $SymbolsDownloaded = $false

    # since BC15, system layer can be defined in dependencies
    $Dependencies = Get-AppKeyValue -SourcePath $SourcePath -KeyName 'dependencies'
    foreach ($Dependency in $Dependencies) {
        if ($Dependency.publisher -eq 'Microsoft') {
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -Publisher $Dependency.publisher -AppName $Dependency.name -Version $Dependency.version
            $SymbolsDownloaded = $true
        }
    }

    Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'System' -Version $Version
    Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Application' -Version $Version

    if ($platform -ge $BCFallPlatform) {
        Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'System Application' -Version $Version
        Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Base Application' -Version $Version

        if ($platform -ge [version]'24.0.0.0') {
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Business Foundation' -Version $Version
        }

        if ($platform -ge [version]'28.0.0.0' -and $includeTestSymbols.IsPresent) {
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'System Application Test Library' -Version $Version
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Application Test Library' -Version $Version
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Permissions Mock' -Version $Version
            Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Any' -Version $Version
        }
    } elseif (!$SymbolsDownloaded -and $includeTestSymbols.IsPresent) {
        # prior to BC15, test symbols available as a separate package
        Invoke-SymbolDownload -ContainerName $ContainerName -ServerInstance $ServerInstance -PackagesPath $PackagesPath -AppName 'Test' -Version (Get-AppKeyValue -SourcePath $SourcePath -KeyName 'test')
    }
}

function Invoke-SymbolDownload {
    Param(
        [string]$ContainerName,
        [string]$ServerInstance,
        [string]$PackagesPath,
        [string]$Publisher = 'Microsoft',
        [string]$AppName,
        [string]$Version
    )

    $Uri = 'http://{0}:7049/{1}/dev/packages?publisher={2}&appName={3}&versionText={4}&tenant=default' -f $ContainerName, $ServerInstance, $Publisher, $AppName, $Version
    Write-Host $Uri
    Invoke-WebRequest -Uri $Uri -Headers (Create-Headers) -OutFile (Join-Path $PackagesPath ('{0}_{1}_{2}.app' -f $Publisher, $AppName, $Version))
}

function Create-Headers
{
    $ba = '{0}:{1}' -f (Get-EnvironmentKeyValue -KeyName 'user'), (Get-EnvironmentKeyValue -KeyName 'password')
    $ba = [System.Text.Encoding]::UTF8.GetBytes($ba)
    $ba = [System.Convert]::ToBase64String($ba)
    $h = @{Authorization=("Basic {0}" -f $ba);'Accept-Encoding'='gzip,deflate'}   
    $h
}

Export-ModuleMember -Function Download-Symbols