Public/Set-LMOpsNote.ps1

<#
.SYNOPSIS
Updates an operations note in LogicMonitor.

.DESCRIPTION
The Set-LMOpsNote function modifies an existing operations note in LogicMonitor.

.PARAMETER Id
Specifies the ID of the operations note to modify.

.PARAMETER Note
Specifies the new content for the note.

.PARAMETER NoteDate
Specifies the date and time for the note.

.PARAMETER Tags
Specifies an array of tags to associate with the note.

.PARAMETER ClearTags
Indicates whether to clear all existing tags.

.PARAMETER DeviceGroupIds
Specifies an array of device group IDs to associate with the note.

.PARAMETER WebsiteIds
Specifies an array of website IDs to associate with the note.

.PARAMETER DeviceIds
Specifies an array of device IDs to associate with the note.

.EXAMPLE
Set-LMOpsNote -Id 123 -Note "Updated information" -Tags @("maintenance", "planned")
Updates the operations note with ID 123 with new content and tags.

.INPUTS
You can pipe objects containing Id properties to this function.

.OUTPUTS
Returns the response from the API containing the updated operations note information.

.NOTES
This function requires a valid LogicMonitor API authentication.
#>


Function Set-LMOpsNote {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [String]$Id,

        [String]$Note,

        [Nullable[Datetime]]$NoteDate,

        [String[]]$Tags,

        [Switch]$ClearTags,

        [String[]]$DeviceGroupIds,

        [String[]]$WebsiteIds, 

        [String[]]$DeviceIds
    )

    Begin {}
    Process {
        #Check if we are logged in and have valid api creds
        If ($Script:LMAuth.Valid) {

            If ($NoteDate) {
                $Epoch = Get-Date -Date "01/01/1970"
                [int64]$NoteDate = (New-TimeSpan -Start $Epoch -End $NoteDate.ToUniversalTime()).TotalSeconds
            }

            $Scope = @()
            If ($ResourceIds -or $WebsiteIds -or $DeviceGroupIds) {
                Foreach ($deviceId in $DeviceIds) {
                    $Scope += [PSCustomObject]@{
                        type     = "device"
                        groupId  = "0"
                        deviceId = $deviceId
                    }
                }
                Foreach ($websiteId in $WebsiteIds) {
                    $Scope += [PSCustomObject]@{
                        type      = "website"
                        groupId   = "0"
                        websiteId = $websiteId
                    }
                }
                Foreach ($groupId in $DeviceGroupIds) {
                    $Scope += @{
                        type    = "deviceGroup"
                        groupId = $groupId
                    }
                }
            }

            $TagList = @()
            Foreach ($tag in $Tags) {
                $TagList += @{name = $tag }
            }


            #Build header and uri
            $ResourcePath = "/setting/opsnotes/$Id"

            Try {
                $Data = @{
                    happenOnInSec = $NoteDate
                    note          = $Note
                    tags          = $TagList
                    scopes        = $Scope
                }

                #Remove empty keys so we dont overwrite them
                @($Data.keys) | ForEach-Object { If ([string]::IsNullOrEmpty($Data[$_]) -and ($_ -notin @($MyInvocation.BoundParameters.Keys))) { $Data.Remove($_) } }

                If ($ClearTags) {
                    $Data.tags = @()
                }

                $Data = ($Data | ConvertTo-Json)

                $Headers = New-LMHeader -Auth $Script:LMAuth -Method "PATCH" -ResourcePath $ResourcePath -Data $Data 
                $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath

                Resolve-LMDebugInfo -Url $Uri -Headers $Headers[0] -Command $MyInvocation -Payload $Data

                #Issue request
                $Response = Invoke-RestMethod -Uri $Uri -Method "PATCH" -Headers $Headers[0] -WebSession $Headers[1] -Body $Data

                Return $Response
            }
            Catch [Exception] {
                $Proceed = Resolve-LMException -LMException $PSItem
                If (!$Proceed) {
                    Return
                }
            }
        }
        Else {
            Write-Error "Please ensure you are logged in before running any commands, use Connect-LMAccount to login and try again."
        }
    }
    End {}
}