Public/Set-LMAppliesToFunction.ps1

<#
.SYNOPSIS
Updates a LogicMonitor AppliesTo function.

.DESCRIPTION
The Set-LMAppliesToFunction function modifies an existing AppliesTo function in LogicMonitor, allowing updates to its name, description, and AppliesTo code.

.PARAMETER Name
Specifies the current name of the AppliesTo function. This parameter is mandatory when using the 'Name' parameter set.

.PARAMETER NewName
Specifies the new name for the AppliesTo function.

.PARAMETER Id
Specifies the ID of the AppliesTo function to modify.

.PARAMETER Description
Specifies a new description for the AppliesTo function.

.PARAMETER AppliesTo
Specifies the new AppliesTo code for the function.

.EXAMPLE
Set-LMAppliesToFunction -Id 123 -NewName "UpdatedFunction" -Description "New description"
Updates the AppliesTo function with ID 123 with a new name and description.

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

.OUTPUTS
Returns a LogicMonitor.AppliesToFunction object containing the updated function information.

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

Function Set-LMAppliesToFunction {

    [CmdletBinding(DefaultParameterSetName = 'Id', SupportsShouldProcess, ConfirmImpact = 'None')]
    Param (
        [Parameter(Mandatory, ParameterSetName = 'Name')]
        [String]$Name,

        [String]$NewName,

        [Parameter(Mandatory, ParameterSetName = 'Id', ValueFromPipelineByPropertyName)]
        [String]$Id,

        [String]$Description,

        [String]$AppliesTo

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

        #Lookup Id if supplying name
        If ($Name) {
            $LookupResult = (Get-LMAppliesToFunction -Name $Name).Id
            If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                return
            }
            $Id = $LookupResult
        }

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

        If ($PSItem) {
            $Message = "Id: $Id | Name: $($PSItem.name)"
        }
        Else {
            $Message = "Id: $Id"
        }

        Try {
            $Data = @{
                name        = $NewName
                description = $Description
                code        = $AppliesTo
            }

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

            $Data = ($Data | ConvertTo-Json)

            If ($PSCmdlet.ShouldProcess($Message, "Set AppliesTo Function")) {  
                $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 (Add-ObjectTypeInfo -InputObject $Response -TypeName "LogicMonitor.AppliesToFunction" )
            }
        }
        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."
    }
}