Private/MSCatalog/Sort-CatalogResults.ps1

function Sort-CatalogResults {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string] $Uri,

        [Parameter(Mandatory = $false)]
        [ValidateSet("Title", "Products", "Classification", "LastUpdated", "Size")]
        [string] $SortBy,

        [Parameter(Mandatory = $false)]
        [switch] $Descending,

        [Parameter(DontShow)]
        [string] $EventArgument,

        [Parameter(DontShow)]
        [string] $EventValidation,

        [Parameter(DontShow)]
        [string] $ViewState,

        [Parameter(DontShow)]
        [string] $ViewStateGenerator
    )

    $EventTarget = switch ($SortBy) {
        {$_ -eq "Title"} {'ctl00$catalogBody$updateMatches$ctl02$titleHeaderLink'}
        {$_ -eq "Products"} {'ctl00$catalogBody$updateMatches$ctl02$productsHeaderLink'}
        {$_ -eq "Classification"} {'ctl00$catalogBody$updateMatches$ctl02$classHeaderLink'}
        {$_ -eq "LastUpdated"} {'ctl00$catalogBody$updateMatches$ctl02$dateHeaderLink'}
        {$_ -eq "Size"} {'ctl00$catalogBody$updateMatches$ctl02$sizeHeaderLink'}
    }

    $Params = @{
        Uri = $Uri
        Method = "Post"
        EventArgument = $EventArgument
        EventTarget = $EventTarget
        EventValidation = $EventValidation
        ViewState = $ViewState
        ViewStateGenerator = $ViewStateGenerator
    }
    $Res = Invoke-CatalogRequest @Params

    # By default the LastUpdated field is sorted in descending order from the catalog website the first time you
    # issue the sort POST request. All the other fields are sorted in ascending order first as you would expect.
    # To ensure that this sort function is predictable we re-request the sorted request if the SortBy parameter is LastUpdated
    # and the Descending parameter is $false in order to return the results sorted in ascending order which is what would
    # be expected.
    if (($SortBy -eq "LastUpdated") -and -not $Descending) {
        $Params = @{
            Uri = $Uri
            Method = "Post"
            EventArgument = $Res.EventArgument
            EventTarget = $EventTarget
            EventValidation = $Res.EventValidation
            ViewState = $Res.ViewState
            ViewStateGenerator = $Res.ViewStateGenerator
        }
        $Res = Invoke-CatalogRequest @Params
    } elseif (($SortBy -ne "LastUpdated") -and $Descending) {
        $Params = @{
            Uri = $Uri
            Method = "Post"
            EventArgument = $Res.EventArgument
            EventTarget = $EventTarget
            EventValidation = $Res.EventValidation
            ViewState = $Res.ViewState
            ViewStateGenerator = $Res.ViewStateGenerator
        }
        $Res = Invoke-CatalogRequest @Params
    }

    $Res
}