Public/Update-DynDnsRecord.ps1

function Update-DynDnsRecord {
    [CmdLetBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact='High'
    )]
    param(
        [Parameter(Mandatory=$true)]
        [DynDnsRecord]$DynDnsRecord,
        [Parameter(Mandatory=$true)]
        [DynDnsRecord]$UpdatedDynDnsRecord
    )

    if (-Not (Test-DynDnsSession)) {
        return
    }

    if ($DynDnsRecord.GetType() -ne $UpdatedDynDnsRecord.GetType()) {
        Write-Warning -Message "The original record type does not match the updated record type."
        return
    } else {
        Write-Verbose -Message "The original record type matches the updated record type."
    }

    $Fqdn = $DynDnsRecord.Name
    $Zone = $DynDnsRecord.Zone
    $RecordType = $DynDnsRecord.Type
    $RecordId = $DynDnsRecord.RecordId

    if ($RecordType -eq 'SOA') {
        $Body = $UpdatedDynDnsRecord.RawData | ConvertTo-Json | ConvertFrom-Json
        Add-Member -InputObject $Body -MemberType NoteProperty -Name serial_style -Value $DynDnsRecord.RawData.serial_style -Force
        $JsonBody = $Body | Select-Object * -ExcludeProperty record_type | ConvertTo-Json
    } else {
        $JsonBody = $UpdatedDynDnsRecord.RawData | ConvertTo-Json | ConvertFrom-Json | Select-Object * -ExcludeProperty record_type | ConvertTo-Json
    }

    $UpdatedAttributes = Compare-ObjectProperties -ReferenceObject $DynDnsRecord -DifferenceObject $UpdatedDynDnsRecord | ForEach-Object {
        if ($_.DiffValue.length -gt 0 -and $_.DiffValue -ne 0) { $_ }
    }
    $UpdatedAttributes = $UpdatedAttributes | Select-Object @{label='Attribute';expression={$_.PropertyName}},
        @{label='Original';expression={$_.RefValue}},@{label='Updated';expression={$_.DiffValue}} | Out-String

    $OriginalRecord = "`n" + '-' * 80 + "`n"
    $OriginalRecord += "Original DNS Record:`n"
    $OriginalRecord += ($DynDnsRecord | Out-String).Trim() + "`n`n"
    Write-Verbose -Message $OriginalRecord

    $Updates = "`n" + '-' * 80 + "`n"
    $Updates += "Update DNS Record Attributes::`n"
    $Updates += $UpdatedAttributes.Trim() + "`n"
    $Updates += "`n" + '-' * 80 + "`n"
    Write-Verbose -Message $Updates

    if ($PSCmdlet.ShouldProcess("$Fqdn","Update DNS $RecordType record")) {
        $UpdateDnsRecord = Invoke-DynDnsRequest -UriPath "/REST/$($RecordType)Record/$Zone/$Fqdn/$RecordId" -Method Put -Body $JsonBody
        Write-DynDnsOutput -DynDnsResponse $UpdateDnsRecord
    } else {
        Write-Verbose "Whatif : Updated DNS $RecordType record"
    }
}