functions/Public/Methods/Get-Mga.ps1

function Get-Mga {
    <#
    .LINK
    https://github.com/baswijdenes/Optimized.Mga/
 
    .LINK
    https://baswijdenes.com/c/microsoft/mga/
 
    .SYNOPSIS
    Get-Mga is an Alias for the method Get.
     
    .DESCRIPTION
    Gets an object in the Azure AD tenant with the Microsoft Graph API.
    Json, XML, and CSV is converted to a PSObject.
 
    .PARAMETER Uri
    Uri to the Microsoft Graph API.
    You can also use the last part of an Uri and the rest will be automatically added.
    Example: /users
    Example: https://graph.microsoft.com/v1.0/users
    Example: users?$filter=displayName eq 'Bas Wijdenes'
    Example: beta/users
 
    .PARAMETER SkipNextLink
    When you use this switch it will only return the first data result of the response without checking the NextDataLink URL.
 
    .PARAMETER Reference
    This is not a mandatory parameter.
    By using v1.0 or beta it will always overwrite the value given in the Uri.
    By using All it will first try v1.0 in a try and catch. and when it jumps to the catch it will use the beta reference.
 
    .PARAMETER CustomHeader
    This not a not mandatory parameter, there is a default header containing application/json.
    By using this parameter you can add a custom header. The CustomHeader is reverted back to the original after the cmdlet has run.
     
    .EXAMPLE
    Get-Mga -Uri 'v1.0/users' -SkipNextLink
 
    .EXAMPLE
    Get-Mga -Uri 'users?$top=999'
 
    .EXAMPLE
    Get-Mga -Uri 'https://graph.microsoft.com/v1.0/users/Testuser@baswijdenes.com'
 
    .EXAMPLE
    $Uri = 'https://graph.microsoft.com/v1.0/users?$select=id,userPrincipalName,lastPasswordChangeDateTime,createdDateTime,PasswordPolicies'
    Get-Mga -Uri $Uri -Reference 'All'
 
    .EXAMPLE
    $Uri = '/beta/users?$filter=(UserType eq 'Guest')&$select=displayName,userPrincipalName,createdDateTime,signInActivity'
    Get-Mga -Uri $Uri -Reference 'v1.0'
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias('URL')]
        [string]
        $Uri,
        [Parameter(Mandatory = $false)]      
        [switch]
        [Alias('Once')]
        $SkipNextLink,
        [Parameter(Mandatory = $false)]      
        [string]
        [ValidateSet('All', 'v1.0', 'beta')]
        $Reference,
        [Parameter(Mandatory = $false)]
        [object]
        $CustomHeader
    )
    begin {
        try {
            $StartMgaBeginDefault = Start-MgaBeginDefault -CustomHeader $CustomHeader -Reference $Reference -Uri $Uri
            $Uri = $StartMgaBeginDefault.Uri
            $UpdateMgaUriReference = $StartMgaBeginDefault.UpdateMgaUriReference
            $InvokeWebRequestSplat = @{
                Headers = $Script:MgaSession.HeaderParameters
                Uri     = $Uri
                Method  = 'Get'
            }
        }
        catch {
            throw $_
        }
    }
    process {
        try {
            $Result = Invoke-WebRequest @InvokeWebRequestSplat
            if ($result.Headers.'Content-Type' -like 'application/octet-stream;*') {
                Write-Verbose 'Converting response from CSV to PSObject'
                $EndResult = ConvertFrom-Csv -Body $Result
            }
            if ($result.Headers.'Content-Type' -like 'application/json;*') {   
                Write-Verbose 'Converting response from JSON to PSObject'
                $Result = ConvertFrom-Json -InputObject $Result
                $EndResult = @()
                $EndResult += ConvertTo-MgaResult -Response $Result
                if (-not($SkipNextLink)) {
                    While ($Result.'@odata.nextLink') {
                        Write-Verbose '@odata.nextLink property found, invoking again for more data'
                        Update-MgaOauthToken
                        $InvokeWebRequestSplat.Uri = $Result.'@odata.nextLink'
                        $Result = (Invoke-WebRequest @InvokeWebRequestSplat).Content | ConvertFrom-Json
                        $EndResult += ConvertTo-MgaResult -Response $Result
                    }
                }
            }
            if ((-not($EndResult)) -and ($Reference -eq 'All') -and ($UpdateMgaUriReference.Reference -eq 'v1.0')) {
                Write-Warning 'No data found, trying again with -Reference beta'
                throw $_
            }
        }
        catch {
            $StartMgaProcessCatchDefaultSplat = @{
                Uri                   = $Uri
                Reference             = $Reference
                UpdateMgaUriReference = $UpdateMgaUriReference
                Result                = $Result
                Throw                 = $_
            }
            $Uri = (Start-MgaProcessCatchDefault @StartMgaProcessCatchDefaultSplat).Uri 
            $MgaSplat = @{
                Uri = $Uri
            }
            if ($SkipNextLink) {
                $MgaSplat.SkipNextLink = $true
            }
            $EndResult += Get-Mga @MgaSplat
            $ReturnVerbose = $false
        }
    }
    end {
        Complete-MgaResult -Result $EndResult -CustomHeader $CustomHeader -ReturnVerbose $ReturnVerbose
    }
}