Misc/Get-ProperArtifactUrl.ps1

function Get-ProperArtifactUrl {
    Param(
        [Parameter(Mandatory=$true)]
        [ref]$Version,
        [Parameter(Mandatory=$false)]
        [string]$CU = "",
        [Parameter(Mandatory=$true)]
        [ref]$Country,
        [Parameter(Mandatory=$false)]
        [string]$ArtifactUrl = "",
        [Parameter(Mandatory=$true)]
        [ref]$target,
        [Parameter(Mandatory=$true)]
        [ref]$imageName,
        [Parameter(Mandatory=$false)]
        [string]$SourcePath = (Get-Location)
    )

    $settings = Import-Config
    if ($null -eq $imageName.Value -or $imageName.value -eq "") {
        $imageName.Value = $settings.prefix
    }

    $aliasBC = @("current","latest","nextminor","nextmajor")
    $aliasNAV = @(2016,2017,2018)
    $aliasNAVNumeric = @(9,10,11)

    if ($ArtifactUrl -ne "") {
        if ($ArtifactUrl.Contains("onprem")) {
            $target.Value = "OnPrem"
        }
        else {
            $target.Value = "Sandbox"
        }
        $Country.Value = $ArtifactUrl.Split("/")[-1]
        $Version.Value = $ArtifactUrl.Split("/")[-2]
    }

    switch($target.Value) {
        "" {
                if (@("","Cloud","Extension").Contains((Get-AppKeyValue -KeyName "Target" -SourcePath $SourcePath))) {
                    $target.Value = "Sandbox"
                }
                else {
                    $target.Value = "OnPrem"
                }
        }
        "Cloud" {
            $target.Value = "Sandbox"
        }
    }

    if ($Country.Value -eq "") {
        $Country.Value = "us"
    }

    if ($null -eq $Version.Value -or $Version.Value -eq "") {
        $Version.Value = Get-AppKeyValue -SourcePath $SourcePath -KeyName "platform"
    }
    if ($null -eq $Version.Value -or $Version.Value -eq "") {
        $Version.Value = "Current"
    }

    if ($aliasBC.Contains($Version.Value)) {
        $target.Value = "Sandbox"
    }

    # adjusting Country, if older versions of BC/NAV
    if (!($aliasBC.Contains($Version.Value.ToLower())) -and ($Version.Value -lt "15" -or $Version.Value -gt "2000" -or ([version]$Version.Value).Major -lt 15)) {
        $Country.Value = "na"
    }

    try {
        switch -Wildcard ($Version.Value) {
            {"Current", "Latest" -eq $_ } {
                $ArtifactUrl = Get-BCArtifactUrl -country $Country.Value -select Latest
                $Version.Value = $ArtifactUrl.Split('/')[-2]
                break;
            }
            "NextM*" {
                try {
                    $saasToken = Get-Secret -secretName "insiderToken"
                    $artifactUrl = Get-BCArtifactUrl -country $Country.Value -select $Version.Value -sasToken "$saasToken"
                    $Version.Value = $ArtifactUrl.Split('/')[-2]
                }
                catch {
                    throw "Could not retrieve SaaSToken"
                }
                break;
            }
            default {
                if (!($Version.Value -is [ValueType] -or [Double]::TryParse($Version.Value,[ref]$null) -or [version]::TryParse($Version.Value, [ref]$null) )) {
                    throw "The version '$($Version.Value)' is not a valid version"
                }
                if (!$Version.Value.Contains('.')) {
                    if ($CU -eq "") {
                        $cu = Get-EnvironmentKeyValue -KeyName "cu" -SourcePath $SourcePath
                    }
                    if ($CU -ne "") {
                        $Version.Value = ("{0}.{1}" -f $Version.Value, $CU)
                    }
                    else {
                        $Version.Value = ("{0}.0" -f $Version.Value)
                    }
                }
                break;
            }
        }
    }
    catch {
        throw "Could not retrieve version '$($Version.Value)'"
    }

    # there is a bug in the 17.0 container images, so always using 17.1 then
    if ($Version.Value -eq "17.0") {
        $Version.Value = "17.1"
    }

    $Major = ([version]$Version.Value).Major
    $Minor = ([version]$Version.Value).Minor

    if ($aliasNAVNumeric.Contains($Major)) {
        switch ($Major) {
            9 {
                $Major = 2016
                break
            }
            10 {
                $Major = 2017
                break
            }
            11 {
                $Major = 2018
                break
            }
        }

        $tempArtifactUrl = ""
        [int]$cu = -1
        try {
            do {
                $cu = $cu + 1
                $tempArtifactUrl = Get-NavArtifactUrl -nav $Major -cu $cu -country $Country.Value -select Latest
            } while ($tempArtifactUrl -ne $ArtifactUrl)
        }
        catch {
            throw "Could not evaluate artifact url"
        }
        $Minor = $cu
    }
    else {
        if ($ArtifactUrl -ne "") {
            if ($aliasNAV.Contains($Major)) {
                $tempUrl = Get-NavArtifactUrl -nav $Major -cu $Minor -country $Country.Value -select Latest
                if ($tempUrl -ne $ArtifactUrl) {
                    $ArtifactUrl = $tempUrl
                }
            }
            else {

            }
        }
    }

    if ($aliasNAV.Contains($Major)) {
        if ($ArtifactUrl -eq "") {
            $ArtifactUrl = Get-NavArtifactUrl -nav $Major -cu $Minor -select Latest -country $Country.Value.ToLower()
        }
        if (!$Version.Value.StartsWith('navx:')) {
            $imageName.Value = "$($imageName.Value):$Major-$Minor-$($country.Value)"
        }
        else {
            $imageName.Value = $Version.Value
        }

        $Version.Value = $Major
        $target.Value = "OnPrem"
    }
    else {
        $parameters = @{}
        if ($aliasBC.Contains($Major)) {
            $saasToken = Get-Secret -secretName "insiderToken"
            if ($null -ne $saasToken -and $saasToken -ne "") {
                $parameters.Add("sasToken", $saasToken)
            }
        }
        if ($ArtifactUrl -eq "") {
            $artifactUrl = Get-BCArtifactUrl -version $Version.Value -select Latest -country $Country.Value.ToLower() -Type $target.Value @parameters
        }
        if (!$Version.Value.StartsWith('navx:')) {
            if ($Version.Value -eq "NextMinor" -or $Version.Value -eq "NextMajor") {
                if ($artifactUrl.StartsWith("https://bcinsider.azureedge.net/sandbox/")) {
                    $tempVersion = [version]$artifactUrl.Substring(40).SubString(0, $artifactUrl.Substring(40).IndexOf("/"))
                    $Version.Value = ("{0}.{1}" -f $tempVersion.Major, $tempVersion.Minor)
                }
            }
            $imageName.Value = "$($imageName.Value):$($Version.Value)-$($Country.Value)-$($target.Value)"
        }
        else {
            $imageName.Value = $Version.Value
        }
    }

    return $ArtifactUrl
}