Scripts/utils/Invoke-ElasticRequest.ps1

<#
.SYNOPSIS
    Invokes requests to elastic
.DESCRIPTION
    Used by most functions to talk to your configured elastic endpoint. Performs some basic string building and validation
.EXAMPLE
    PS C:\> Invoke-ElasticRequest -ElasticConnection (Get-ElasticConnection) -Resource '_cluster/health'
    Performs a get request to https://yourelasticendpoint.com/_cluster/health
#>

function Invoke-ElasticRequest {
    [cmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory)]
        [object]$ElasticConnection,

        [Parameter(Mandatory)]
        [string]$Resource,

        [Parameter(Mandatory=$false)]
        [Object[]]$QueryVariables,

        [Parameter(Mandatory=$false)]
        [ValidateSet('GET','POST','PUT', 'DELETE', 'HEAD')]
        [string]$Method = 'GET',

        [Parameter(Mandatory=$false)]
        [ValidateScript({
            if($_ -and !(Test-ElasticJson $_))
            {
                Write-ElasticLog -Level 'Error' -Message "'$_' Must be valid JSON" -ErrorAction Stop
            }else {
                return $true
            }
        })]
        [string]$Content
    )
    If ($PSCmdlet.ShouldProcess("Message")) {
        $uri = (Join-ElasticParts -Separator '/' -Parts $ElasticConnection.BaseUrl,$Resource)
        if ($QueryVariables) {
            $uri += Get-ElasticQueryString -QueryVariables $QueryVariables
        }
        if (!$Content) {
            Write-ElasticLog "$Method $uri"
            Invoke-RestMethod -Method $Method -Uri $uri -Headers $ElasticConnection.header
        }
        else
        {
            Write-ElasticLog "$Method $uri `n$($Content | Format-List | Out-String)"
            Invoke-RestMethod -Method $Method -Uri $uri -Headers $ElasticConnection.header -Body $Content -ContentType 'application/json'
        }
    }
}