Public/Get-JsmAlert.ps1

function Get-JsmAlert {
    <#
    .SYNOPSIS
        Retrieves alerts from the JSM Cloud Operations API.

    .DESCRIPTION
        Two modes of operation, selected by parameter set:
        - List (default): GET /v1/alerts with optional Lucene query, sort, and
          page size. Returns the .values payload from the response envelope.
        - ById: GET /v1/alerts/{id} for a single alert. Accepts the id from the
          pipeline (by value or by property name), so you can chain from list
          output: Get-JsmAlert -Query 'status:open' | Get-JsmAlert.

        v0.1.0 returns the raw deserialized JSON. No reshaping or type accelerator.

    .PARAMETER Id
        The alert id (UUID or tinyId). Accepts pipeline input by value and by
        property name.

    .PARAMETER Query
        A Lucene query string (e.g. 'status:open AND priority:P1'). See the
        Atlassian JSM Operations API docs for syntax.

    .PARAMETER Limit
        Maximum number of alerts to return. Maps to the API's 'size' parameter.
        Default 20.

    .PARAMETER OrderBy
        Field to sort by. Default 'updatedAt'.

    .PARAMETER Order
        Sort direction. 'asc' or 'desc'. Default 'desc'.

    .EXAMPLE
        Get-JsmAlert -Limit 5

        Returns the five most recently updated alerts.

    .EXAMPLE
        Get-JsmAlert -Query 'status:open AND priority:P1' -Limit 50

        Returns up to 50 open P1 alerts.

    .EXAMPLE
        Get-JsmAlert -Id 'abc-123-...'

        Returns the detail object for a single alert.

    .OUTPUTS
        System.Management.Automation.PSCustomObject
        Raw alert objects as deserialized from the API JSON.

    .NOTES
        The List set returns the response.values array; the ById set returns the
        response object directly.
    #>

    [CmdletBinding(DefaultParameterSetName = 'List')]
    [OutputType([pscustomobject])]
    param(
        [Parameter(
            ParameterSetName = 'ById',
            Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Id,

        [Parameter(ParameterSetName = 'List')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Query,

        [Parameter(ParameterSetName = 'List')]
        [ValidateRange(1, 100)]
        [int]
        $Limit = 20,

        [Parameter(ParameterSetName = 'List')]
        [ValidateSet(
            'createdAt', 'updatedAt', 'tinyId', 'alias', 'message', 'status',
            'acknowledged', 'isSeen', 'snoozed', 'snoozedUntil', 'count',
            'lastOccurredAt', 'source', 'owner', 'integration.name',
            'integration.type', 'report.ackTime', 'report.closeTime',
            'report.acknowledgedBy', 'report.closedBy'
        )]
        [string]
        $OrderBy = 'updatedAt',

        [Parameter(ParameterSetName = 'List')]
        [ValidateSet('asc', 'desc')]
        [string]
        $Order = 'desc'
    )

    begin {
        Write-Verbose 'Starting Get-JsmAlert'
    }

    process {
        try {
            if ($PSCmdlet.ParameterSetName -eq 'ById') {
                $response = Invoke-JsmApi -Method 'Get' -Path "/alerts/$Id"
                Write-Output $response
            }
            else {
                $queryParams = @{
                    size    = $Limit
                    sort    = $OrderBy
                    order   = $Order
                }
                if (-not [string]::IsNullOrWhiteSpace($Query)) {
                    $queryParams.query = $Query
                }
                $response = Invoke-JsmApi -Method 'Get' -Path '/alerts' -Query $queryParams
                if ($null -ne $response.values) {
                    Write-Output $response.values
                }
            }
        }
        catch {
            throw
        }
    }

    end {
        Write-Verbose 'Completed Get-JsmAlert'
    }
}