Public/Search/Remove-JIMPredefinedSearchCriterion.ps1

# Copyright (c) Tetron Limited. All rights reserved.
# Licensed under the Tetron Commercial License. See LICENSE file in the project root.

function Remove-JIMPredefinedSearchCriterion {
    <#
    .SYNOPSIS
        Removes a criterion from a Predefined Search criteria group.
 
    .DESCRIPTION
        Deletes a specific criterion from within a Predefined Search criteria group.
 
    .PARAMETER PredefinedSearchId
        The unique identifier of the Predefined Search.
 
    .PARAMETER GroupId
        The unique identifier of the criteria group containing the criterion.
 
    .PARAMETER CriterionId
        The unique identifier of the criterion to remove.
 
    .PARAMETER ChangeReason
        Optional reason for the removal, recorded on the audit Activity and shown in the owning Predefined
        Search's configuration change history.
 
    .OUTPUTS
        None
 
    .EXAMPLE
        Remove-JIMPredefinedSearchCriterion -PredefinedSearchId 3 -GroupId 10 -CriterionId 15
 
        Removes the criterion with ID 15 from group 10.
 
    .EXAMPLE
        Remove-JIMPredefinedSearchCriterion -PredefinedSearchId 3 -GroupId 10 -CriterionId 15 -ChangeReason "No longer required (CHG0130)"
 
        Removes the criterion and records the reason on its owning search's configuration change history.
 
    .LINK
        Get-JIMPredefinedSearchCriteriaGroup
        New-JIMPredefinedSearchCriterion
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [int]$PredefinedSearchId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [int]$GroupId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [Alias('Id')]
        [int]$CriterionId,

        [ValidateNotNullOrEmpty()]
        [string]$ChangeReason
    )

    process {
        if (-not $script:JIMConnection) {
            Write-Error "You are not connected to JIM. Run Connect-JIM -Url <your JIM URL> to authenticate, then try again."
            return
        }

        if ($PSCmdlet.ShouldProcess("Criterion $CriterionId in Group $GroupId on Predefined Search $PredefinedSearchId", "Remove")) {
            Write-Verbose "Removing criterion $CriterionId from group $GroupId in Predefined Search $PredefinedSearchId"
            try {
                $endpoint = "/api/v1/predefined-searches/$PredefinedSearchId/criteria-groups/$GroupId/criteria/$CriterionId"
                if ($ChangeReason) {
                    $endpoint += "?changeReason=$([uri]::EscapeDataString($ChangeReason))"
                }
                Invoke-JIMApi -Endpoint $endpoint -Method 'DELETE'
                Write-Verbose "Removed criterion $CriterionId"
            }
            catch {
                Write-Error "Failed to remove criterion: $_"
            }
        }
    }
}