Public/Add-MessagesToOrg.ps1

<#
    .SYNOPSIS
    Posts message objects to a salesforce REST endpoint

    .DESCRIPTION
    Each message contains the endpoint and the body of the message to post.
    This commandlet uses Write-Progress to report activity

    .INPUTS
    Array of messages

    .OUTPUTS
    None

    .PARAMETER Messages
    An array of PSCustomObject that contain the following properties:
        - endpoint - the Salesforce API endpoint to call
        - body - PS object that represents the body to send to the endpoint. This object will be converted to JSON before post

    .EXAMPLE
    C:\PS> Add-MessageToOrg -Messages @([PSCustomObject]@{ endpoint = "/services/apexrest/foo"; body = [PSCustomObject]@{ value = "1" } })

    .LINK
    Set-Config

    .NOTES
    Assumes config is initialized for org access.
    If the configuration does not contain SalesforcePostObsApiVersion then the default version of '5' is used.
#>

function Add-MessagesToOrg {

    [CmdletBinding()]
    [OutputType([System.Void])]
    param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline)]
        [PSCUstomObject[]]
        $Messages
    )

    begin {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Function started"
    }

    end {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Complete"
    }

    process {
        Write-Debug "[$($MyInvocation.MyCommand.Name)] PSBoundParameters: $($PSBoundParameters | Out-String)"

        $version = $config.SalesforcePostObsApiVersion
        if (-not $version) {
            $version = "5";
        }
        $config = Get-Config
        $sfAuthenticate = $script:__sfAuth
        $headers = Get-SfHeaders
        $headers."Content-Language" = "en-US"
        $headers."Version" = $version
        $i = 0
        $messages | ForEach-Object {
            $apiEndPoint = "$($sfAuthenticate.instance_url)$($_.endpoint)"
            $result = Invoke-RestMethod -Uri $apiEndPoint -Method Post -Headers $headers -Body ($_.body | ConvertTo-Json -Depth 100) -ContentType 'application/json; charset=utf-8' | ConvertFrom-Json
            if ($result.resultstatus.message -ne "Success") {
                Write-Warning "Failed to add message due to '$($result.resultstatus.message)'"
            }
            $i++
            Write-Progress -Activity "Add Messages" -PercentComplete (($i / $messages.Count) * 100) -Status "Added: $i of $($messages.Count)"
        }
    }
}