internal/New-FinalUri.ps1

<#
.SYNOPSIS
    Create a final uri
#>

function New-FinalUri{
    [CmdletBinding()]
    param(
        # Graph endpoint such as "users".
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [string[]] $RelativeUri,
        # Specifies unique Id(s) for the URI endpoint. For example, users endpoint accepts Id or UPN.
        # [Parameter(Mandatory = $false)]
        # [string[]] $UniqueId,
        # Filters properties (columns).
        [Parameter(Mandatory = $false)]
        [string[]] $Select,
        # Filters results (rows). https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter
        [Parameter(Mandatory = $false)]
        [string] $Filter,
        # Parameters such as "$top".
        [Parameter(Mandatory = $false)]
        [hashtable] $QueryParameters,
        # Specifies consistency level.
        # [Parameter(Mandatory = $false)]
        # [string] $ConsistencyLevel = 'eventual',
        # Base URL for Microsoft Graph API.
        [Parameter(Mandatory = $false)]
        [uri] $GraphBaseUri
    )

    begin {
        if(!$GraphBaseUri){
            if(!(Test-Path variable:global:GraphBaseUri)){
                $global:GraphBaseUri = $((Get-MgEnvironment -Name (Get-MgContext).Environment).GraphEndpoint)
            }
            $GraphBaseUri = $global:GraphBaseUri
        }
    }

    process {
        ## Initialize
        # if (!$UniqueId) { [string[]] $UniqueId = '' }

        ## Process Each RelativeUri
        foreach ($uri in $RelativeUri) {
            $uriQueryEndpoint = New-Object System.UriBuilder -ArgumentList $uri

            ## Combine query parameters from URI and cmdlet parameters
            if ($uriQueryEndpoint.Query) {
                [hashtable] $finalQueryParameters = ConvertFrom-QueryString $uriQueryEndpoint.Query -AsHashtable
                if ($QueryParameters) {
                    foreach ($ParameterName in $QueryParameters.Keys) {
                        $finalQueryParameters[$ParameterName] = $QueryParameters[$ParameterName]
                    }
                }
            }
            elseif ($QueryParameters) { [hashtable] $finalQueryParameters = $QueryParameters }
            else { [hashtable] $finalQueryParameters = @{ } }
            if ($Select) { $finalQueryParameters['$select'] = $Select -join ',' }
            if ($Filter) { $finalQueryParameters['$filter'] = $Filter }
            $uriQueryEndpoint.Query = ConvertTo-QueryString $finalQueryParameters

            ## Invoke graph requests individually or save for single batch request
            # foreach ($id in $UniqueId) {
            # $uriQueryEndpointFinal = New-Object System.UriBuilder -ArgumentList $uriQueryEndpoint.Uri
            # $uriQueryEndpointFinal.Path = ([IO.Path]::Combine($uriQueryEndpointFinal.Path, $id))

            # ## Create batch request entry
            # $request = New-Object PSObject -Property @{
            # id = $listRequests.Count #(New-Guid).ToString()
            # method = 'GET'
            # url = $uriQueryEndpointFinal.Uri.AbsoluteUri -replace ('{0}{1}/' -f $GraphBaseUri.AbsoluteUri, $ApiVersion)
            # headers = @{ ConsistencyLevel = $ConsistencyLevel }
            # }
            # $listRequests.Add($request)
            # }

            $uriQueryEndpoint.Uri.AbsoluteUri -replace "http://"
            # $uriQueryEndpointFinal = New-Object System.UriBuilder -ArgumentList $uriQueryEndpoint.Uri
            # $uriQueryEndpointFinal | fl *
            # $uriQueryEndpointFinal.Path = ([IO.Path]::Combine($uriQueryEndpointFinal.Path, $id))
            # $uriQueryEndpointFinal | fl *
            # $uriQueryEndpointFinal.Uri.AbsoluteUri -replace ('{0}/' -f $GraphBaseUri.AbsoluteUri)
        }
    }
}