Functions/Internal/Invoke-ADOAPI.ps1

Function Invoke-ADOAPI {
    [cmdletbinding()]
    param(
        [parameter(Mandatory=$true)]
        [ValidateNotNullorempty()]
            [string]$SourceName,
        [parameter(Mandatory=$false)]
        [ValidateSet("download","query", "publish","delete")]
            [string]$NugetAPI,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$PackageName,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$PackageVersion,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$OutputDirectory,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$PackageID,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$PackageSearch,
        [parameter(Mandatory=$false)]
        [ValidateNotNullorempty()]
            [string]$PackageFilePath
    )
    process {
        Test-ADONugetRepository | Out-Null
        $tempFilePath = [System.IO.Path]::GetTempFileName()
        $Repository = $global:ADONugetConfig | Where-Object {$_.RepositoryName -eq $SourceName}
        if (!($Repository)) {
            throw "repository not found, please use Import-ADONugetRepository or New-ADONugetRepository first"
        }
        if ($repository.AllowInsecureConnections) {
            Enable-SkipCertificateChainControlPolicy
        }
        $Headers = @{
            "X-NuGet-ApiKey" = "az"
            "X-NuGet-Client-Version" = "6.14.0"
            "Authorization" = "Basic "+ [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($Repository.APIKeyName):$($Repository.APIKey)"))
        }
        $BaseADOURI = "https://$($Repository.server)/$($Repository.OrganizationName)/$($Repository.ProjectID)/_packaging/$($Repository.FeedID)"
        $params = @{
            "Headers" = $Headers
            "UserAgent" = "NuGet Command Line/6.14.0 (WINDOWS)"
            "UseBasicParsing" = $true
        }
        if ($NugetAPI) {
            switch ($NugetAPI) {
                "download" {
                    if (!($PackageName) -and !($PackageVersion) -and !($OutputDirectory)) {
                        throw "please use PackageName, PackageVersion, OutputDirectory parameters when using NugetAPI Download parameters"
                    }
                    if (!(test-path $OutputDirectory)) {
                        throw "please set an existing target folder as OutputDirectory when using NugetAPI Download parameters"
                    }
                    $URI = $BaseADOURI + "/nuget/v3/flat2/$($PackageName)/$($PackageVersion)/$($PackageName).$($PackageVersion).nupkg"
                }
                "query" {
                    if (!($PackageSearch)) {
                        throw "please use PackageSearch parameter when using NugetAPI query parameter"
                    }
                    $URI = $BaseADOURI + "/nuget/v3/query2/?q=$([System.Web.HTTPUtility]::UrlEncode($PackageSearch))&skip=0&take=50&prerelease=true&semVerLevel=2.0.0"
                }
                "publish" {
                    if (!($PackageFilePath)) {
                        throw "please use PackageFilePath parameter when using NugetAPI publish parameter"
                    }
                    $URI = $BaseADOURI + "/nuget/v2/"
                    $convertedinfo = Convert-ADONugetRepositoryPackage -PackageFilePath $PackageFilePath
                    $params.add("Infile",$convertedinfo.Infile)
                    $params.add("ContentType",$convertedinfo.contenttype)
                    $params.add("method","Put")
                    $Headers.add("Accept-Encoding","gzip, deflate")
                }
                "delete" {
                    if (!($PackageID) -or !($PackageVersion)) {
                        throw "please use PackageID and PackageVersion parameters when using NugetAPI delete parameter"
                    }
                    $URI = $BaseADOURI + "/nuget/v2/$($PackageID)/$($PackageVersion)"
                    $params.add("method","delete")
                }
            }
            $params.add("URI",$URI)
            write-verbose -message "HTTP HEADERS : $($Headers | out-string)"
        } 
        if ($OutputDirectory) {
            try {
                $result = Invoke-WebRequest -Uri $URI -Headers $Headers -UserAgent "NuGet Command Line/6.14.0 (WINDOWS)" -OutFile $tempFilePath
            } catch {
                if ($PackageAPI) {
                    write-warning -message "Not able to connect to ADO native Package Registry API $($PackageAPI)"
                } elseif ($NugetAPI) {
                    write-warning -message "Not able to connect to ADO Nuget API $($NugetAPI)"
                }
                write-verbose -message "Error Type: $($_.Exception.GetType().FullName)"
                write-verbose -message "Error Message: $($_.Exception.Message)"
                write-verbose -message "HTTP error code:$($_.Exception.Response.StatusCode.Value__)"
                write-verbose -message "HTTP error message:$($_.Exception.Response.StatusDescription)"
            }
            if ($tempFilePath) {
                $newdirectory = "$($packagename).$($packageversion)"
                $newoutputdirectory = join-path $OutputDirectory $newdirectory
                if (!(test-path $newoutputdirectory)) {
                    new-item -ItemType Directory -Path $newoutputdirectory -Force | Out-Null
                }
                $ziptempfile = "$((get-item -path $tempFilePath).basename).zip"
                $ziptempfullpath = join-path (get-item $tempFilePath).Directory $ziptempfile
                move-item -path $tempFilePath -Destination $ziptempfullpath -Force | out-null
                expand-archive -Path $ziptempfullpath -DestinationPath $newoutputdirectory -Force | out-null
                Remove-Item -path $ziptempfullpath -Force | Out-Null
                if (test-path (join-path $newoutputdirectory "_rels")) {
                    remove-item -path (join-path $newoutputdirectory "_rels") -force -Recurse | out-null
                }
                if (test-path (join-path $newoutputdirectory "package")) {
                    remove-item -path (join-path $newoutputdirectory "package") -force -Recurse | out-null
                }
                if (test-path (join-path $newoutputdirectory "``[Content_Types``].xml")) {
                    remove-item -path (join-path $newoutputdirectory "``[Content_Types``].xml") -force | out-null
                }
            }
        } else {
            try {
                $result = Invoke-WebRequest @params
                if ($result.content) {
                    write-verbose -message $result.content
                    return ($result.Content | ConvertFrom-Json)
                } else {
                    return $result
                }
            } catch {
                if ($PackageAPI) {
                    write-warning -message "Not able to connect to ADO native Package Registry API $($PackageAPI)"
                } elseif ($NugetAPI) {
                    write-warning -message "Not able to connect to ADO Nuget API $($NugetAPI)"
                }
                write-verbose -message "Error Type: $($_.Exception.GetType().FullName)"
                write-verbose -message "Error Message: $($_.Exception.Message)"
                write-verbose -message "HTTP error code:$($_.Exception.Response.StatusCode.Value__)"
                write-verbose -message "HTTP error message:$($_.Exception.Response.StatusDescription)"
            }
        }
    }
}