Public/New-LMOpsNote.ps1

<#
.SYNOPSIS
Creates a new LogicMonitor OpsNote.

.DESCRIPTION
The New-LMOpsNote function is used to create a new OpsNote in LogicMonitor. OpsNotes are used to document important information or events related to monitoring.

.PARAMETER Note
Specifies the content of the OpsNote. This parameter is mandatory.

.PARAMETER NoteDate
Specifies the date and time of the OpsNote. If not provided, the current date and time will be used.

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

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

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

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

.EXAMPLE
New-LMOpsNote -Note "Server maintenance scheduled for tomorrow" -NoteDate (Get-Date).AddDays(1) -Tags "maintenance", "server"

This example creates a new OpsNote with the content "Server maintenance scheduled for tomorrow" and a note date set to tomorrow. It also associates the tags "maintenance" and "server" with the OpsNote.

.NOTES
LogicMonitor API credentials must be set before using this function. Use the Connect-LMAccount function to log in and set the credentials.
#>

Function New-LMOpsNote {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [String]$Note,

        [Datetime]$NoteDate,

        [String[]]$Tags,

        [String[]]$DeviceGroupIds,

        [String[]]$WebsiteIds, 

        [String[]]$DeviceIds
    )
    #Check if we are logged in and have valid api creds
    If ($Script:LMAuth.Valid) {

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

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

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


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

        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 $_ -ne "scopes" -and $_ -ne "tags") { $Data.Remove($_) } }

            $Data = ($Data | ConvertTo-Json)

            $Headers = New-LMHeader -Auth $Script:LMAuth -Method "POST" -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 "POST" -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."
    }
}