private/Invoke-OneApiRequest.ps1

function Invoke-OneApiRequest {
    [cmdletbinding()]
    Param(
        [Parameter(Mandatory = $false)]
        [string] $ApiVersion = "beta",

        [Parameter(Mandatory = $true)]
        [string] $ApiResource,

        [Parameter(Mandatory = $true)]
        [Microsoft.PowerShell.Commands.WebRequestMethod] $ApiRequestMethod,

        [Parameter(Mandatory = $false)]
        [string] $ApiRequestBody
    )

    begin {
        Write-Verbose "[$(Get-Date)] [BEGIN ] $($MyInvocation.MyCommand)"
    }

    process {
        $ApiRequest = @{
            Uri = "https://graph.microsoft.com/$($ApiVersion)/$($ApiResource)"
            ContentType = "application/json"
            Headers = @{
                Authorization = "Bearer $($OneShortcutSession.Token.AccessToken)"
                Prefer = "apiversion=2.1"
            }
            Method = $ApiRequestMethod
        }
    
        if ($ApiRequestBody) {
            $ApiRequest.Body = $ApiRequestBody
        }

        $Api = @{
            Response = @{
                StatusCode = $null
                Message = $null
            }
            Data = $null   
        }
    
        try {
            Write-Verbose "[$(Get-Date)] [CALL ] Invoke-RestMethod($($ApiRequest.Uri), $($ApiRequest.ContentType), $($ApiRequest.Headers.Authorization), $($ApiRequest.Headers.Prefer), $($ApiRequest.Method), $($ApiRequest.Body))"
            $ApiResponse = (Invoke-WebRequest @ApiRequest)
            $ApiData = (ConvertFrom-Json $([String]::new($ApiResponse.Content)))

            $Api.Response.StatusCode = $ApiResponse.StatusCode
            $Api.Data = $ApiData
        } catch {
            $Api.Response.StatusCode = $_.Exception.Response.StatusCode.value__
            $Api.Response.Message = $_.Exception.Message
        }

        return $Api
    }

    end {
        Write-Verbose "[$(Get-Date)] [END ] $($MyInvocation.MyCommand)"
    }
}