functions/Merge-User.ps1


function Merge-User {
    <#
    .SYNOPSIS
        Merges two end users together.
    .DESCRIPTION
        Merges two end users together. Agents and Admin cannot be merged.
    .EXAMPLE
        PS C:\> Merge-ZendeskUser -UserId 1 -TargetUserId 2

        Merges end user with id 1 into end user with id 2.
    .EXAMPLE
        PS C:\> Merge-ZendeskUser -Context $context -UserId 1 -TargetUserId 2

        Merges end user with id 1 into end user with id 2 providing a connection context returend by `Get-ZendeskConnection`
    #>

    [OutputType([PSCustomObject])]
    [CMDletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
    Param (
        # Unique Id of the user to merge
        [Parameter(Mandatory = $true)]
        [ValidateRange(1, [Int64]::MaxValue)]
        [Int64]
        $UserId,

        # Unique Id of the user to merge into
        [Parameter(Mandatory = $true)]
        [ValidateRange(1, [Int64]::MaxValue)]
        [Int64]
        $TargetUserId,

        # Zendesk Connection Context from `Get-ZendeskConnection`
        [Parameter(Mandatory = $false)]
        [PSTypeName('ZendeskContext')]
        [PSCustomObject]
        $Context = $null
    )

    Assert-IsAdmin -Context $Context

    $path = "/api/v2/users/$UserId/merge.json"
    $body = @{
        user = @{
            id = $TargetUserId
        }
    }

    if ($PSCmdlet.ShouldProcess("$UserId => $TargetUserId", 'Merge user.')) {
        $result = Invoke-Method -Context $Context -Method 'Put' -Path $path -Body $body -Verbose:$VerbosePreference
        $result
    }

}