Public/message-center.ps1

function Add-FalconCompleteActivity {
    [CmdletBinding(DefaultParameterSetName = '/message-center/entities/case-activity/v1:post')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case-activity/v1:post', Mandatory = $true,
            Position = 1)]
        [string] $Id,

        [Parameter(ParameterSetName = '/message-center/entities/case-activity/v1:post', Mandatory = $true,
            Position = 2)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $UserId,

        [Parameter(ParameterSetName = '/message-center/entities/case-activity/v1:post', Mandatory = $true,
            Position = 3)]
        [ValidateSet('comment')]
        [string] $Type,

        [Parameter(ParameterSetName = '/message-center/entities/case-activity/v1:post', Mandatory = $true,
            Position = 4)]
        [string] $Content
    )
    begin {
        $Fields = @{
            Content = 'body'
            Id      = 'case_id'
            UserId  = 'user_uuid'
        }
    }
    process {
        if (!$Script:Falcon.Hostname) {
            Request-FalconToken
        }
        $Param = @{
            Path    = "$($Script:Falcon.Hostname)/message-center/entities/case-activity/v1"
            Method  = 'post'
            Headers = @{
                Accept      = 'application/json'
                ContentType = 'application/json'
            }
            Body    = @{}
        }
        (Update-FieldName -Fields $Fields -Inputs $PSBoundParameters).GetEnumerator().foreach{
            $Param.Body[$_.Key.ToLower()] = $_.Value
        }
        $Param.Body = ConvertTo-Json -InputObject $Param.Body
        $Request = $Script:Falcon.Api.Invoke($Param)
        Write-Result -Request $Request
    }
}
function Edit-FalconCompleteCase {
    [CmdletBinding(DefaultParameterSetName = '/message-center/entities/case/v1:patch')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case/v1:patch', Mandatory = $true, Position = 1)]
        [string] $Id,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:patch', Position = 2)]
        [string] $Content,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:patch', Position = 3)]
        [ValidatePattern('^ldt:\w{32}:\d+$')]
        [array] $DetectionIds,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:patch', Position = 4)]
        [ValidatePattern('^inc:\w{32}:\w{32}$')]
        [array] $IncidentIds
    )
    begin {
        $Fields = @{
            Content      = 'body'
            DetectionIds = 'detections'
            IncidentIds  = 'incidents'
        }
    }
    process {
        if (!$Script:Falcon.Hostname) { Request-FalconToken }
        @('DetectionIds','IncidentIds').foreach{
            if ($PSBoundParameters.$_) {
                [array] $PSBoundParameters.$_ = ($PSBoundParameters.$_).foreach{ @{ id = $_ } }
            }
        }
        $Param = @{
            Path    = "$($Script:Falcon.Hostname)/message-center/entities/case/v1"
            Method  = 'patch'
            Headers = @{
                Accept      = 'application/json'
                ContentType = 'application/json'
            }
            Body    = @{}
        }
        (Update-FieldName -Fields $Fields -Inputs $PSBoundParameters).GetEnumerator().foreach{
            $Param.Body[$_.Key.ToLower()] = $_.Value
        }
        $Param.Body = ConvertTo-Json -InputObject $Param.Body
        $Request = $Script:Falcon.Api.Invoke($Param)
        Write-Result -Request $Request
    }
}
function Get-FalconCompleteActivity {
    [CmdletBinding(DefaultParameterSetName = '/message-center/queries/case-activities/v1:get')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case-activities/GET/v1:post', Mandatory = $true,
            Position = 1)]
        [array] $Ids,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get', Mandatory = $true,
            Position = 1)]
        [string] $CaseId,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get', Position = 2)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get', Position = 3)]
        [ValidateSet('activity.created_time.asc', 'activity.created_time.desc', 'activity.type.asc',
            'activity.type.desc')]
        [string] $Sort,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get', Position = 4)]
        [ValidateRange(1,500)]
        [int] $Limit,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get', Position = 5)]
        [string] $Offset,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get')]
        [switch] $Detailed,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get')]
        [switch] $All,

        [Parameter(ParameterSetName = '/message-center/queries/case-activities/v1:get')]
        [switch] $Total
    )
    begin {
        $Fields = @{ CaseId = 'case_id' }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format    = @{
                Body  = @{ root = @('ids') }
                Query = @('case_id', 'filter', 'sort', 'limit', 'offset')
            }
        }
        Invoke-Falcon @Param
    }
}
function Get-FalconCompleteCase {
    [CmdletBinding(DefaultParameterSetName = '/message-center/queries/cases/v1:get')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/cases/GET/v1:post', Mandatory = $true,
            Position = 1)]
        [array] $Ids,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get', Position = 1)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get', Position = 2)]
        [ValidateSet('case.created_time.asc', 'case.created_time.desc', 'case.id.asc', 'case.id.desc',
            'case.last_modified_time.asc', 'case.last_modified_time.desc', 'case.status.asc', 'case.status.desc',
            'case.type.asc', 'case.type.desc')]
        [string] $Sort,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get', Position = 3)]
        [ValidateRange(1,500)]
        [int] $Limit,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get', Position = 4)]
        [string] $Offset,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get')]
        [switch] $Detailed,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get')]
        [switch] $All,

        [Parameter(ParameterSetName = '/message-center/queries/cases/v1:get')]
        [switch] $Total
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format   = @{
                Body = @{ root = @('ids') }
                Query = @('filter', 'sort', 'limit', 'offset')
            }
        }
        Invoke-Falcon @Param
    }
}
function New-FalconCompleteCase {
    [CmdletBinding(DefaultParameterSetName = '/message-center/entities/case/v1:post')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $UserId,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Mandatory = $true, Position = 2)]
        [ValidateSet('fc:detection-support','fc:contact','fc:falcon-product-support','fc:incident-support')]
        [string] $Type,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Mandatory = $true, Position = 3)]
        [string] $Title,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Mandatory = $true, Position = 4)]
        [string] $Content,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Position = 5)]
        [ValidatePattern('^ldt:\w{32}:\d+$')]
        [ValidateScript({
            if ($PSBoundParameters.Type -eq 'fc:detection-support') {
                $true
            } else {
                throw "Detection identifiers are used with type 'fc:detection-support'."
            }
        })]
        [array] $DetectionIds,

        [Parameter(ParameterSetName = '/message-center/entities/case/v1:post', Position = 6)]
        [ValidatePattern('^inc:\w{32}:\w{32}$')]
        [ValidateScript({
            if ($PSBoundParameters.Type -eq 'fc:incident-support') {
                $true
            } else {
                throw "Incident identifiers are used with type 'fc:incident-support'."
            }
        })]
        [array] $IncidentIds
    )
    begin {
        $Fields = @{
            Content      = 'body'
            UserId       = 'user_uuid'
            DetectionIds = 'detections'
            IncidentIds  = 'incidents'
        }
    }
    process {
        if (!$Script:Falcon.Hostname) { Request-FalconToken }
        @('DetectionIds','IncidentIds').foreach{
            if ($PSBoundParameters.$_) {
                [array] $PSBoundParameters.$_ = ($PSBoundParameters.$_).foreach{ @{ id = $_ } }
            }
        }
        $Param = @{
            Path    = "$($Script:Falcon.Hostname)/message-center/entities/case/v1"
            Method  = 'post'
            Headers = @{
                Accept      = 'application/json'
                ContentType = 'application/json'
            }
            Body    = @{}
        }
        (Update-FieldName -Fields $Fields -Inputs $PSBoundParameters).GetEnumerator().foreach{
            $Param.Body[$_.Key.ToLower()] = $_.Value
        }
        $Param.Body = ConvertTo-Json -InputObject $Param.Body
        $Request = $Script:Falcon.Api.Invoke($Param)
        Write-Result -Request $Request
    }
}
function Receive-FalconCompleteAttachment {
    [CmdletBinding(DefaultParameterSetName = '/message-center/entities/case-attachment/v1:get')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case-attachment/v1:get', Mandatory = $true,
            Position = 1)]
        [array] $Id,

        [Parameter(ParameterSetName = '/message-center/entities/case-attachment/v1:get', Mandatory = $true,
            Position = 2)]
        [ValidateScript({
            if (Test-Path $_) { throw "An item with the specified name $_ already exists." } else { $true }
        })]
        [string] $Path
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format    = @{
                Query   = @('id')
                Outfile = 'path'
            }
        }
        Invoke-Falcon @Param
    }
}
function Send-FalconCompleteAttachment {
    [CmdletBinding(DefaultParameterSetName = '/message-center/entities/case-attachment/v1:post')]
    param(
        [Parameter(ParameterSetName = '/message-center/entities/case-attachment/v1:post', Mandatory = $true,
            Position = 1)]
        [array] $Id,

        [Parameter(ParameterSetName = '/message-center/entities/case-attachment/v1:post', Mandatory = $true,
            Position = 2)]
        [ValidatePattern('\.(bmp|csv|doc|docx|gif|jpg|jpeg|pdf|png|pptx|txt|xls|xlsx)$')]
        [ValidateScript({
            if (Test-Path -Path $_ -PathType Leaf) {
                $Leaf = Split-Path $_ -Leaf
                if ($Leaf -match '\W') {
                    throw 'Filename contains invalid characters.'
                } elseif (((Split-Path $_ -Leaf) -Split '.')[0].Length -gt 255) {
                    throw 'Maximum filename length is 255 characters.'
                } else {
                    $true
                }
            } else {
                throw "Cannot find path '$_' because it does not exist or is a directory."
            }
        })]
        [string] $Path
    )
    begin {
        $Fields = @{
            Id     = 'case_id'
            Path   = 'file'
            UserId = 'user_uuid'
        }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Headers  = @{ ContentType = 'multipart/form-data' }
            Format    = @{ Formdata = @('case_id', 'user_uuid', 'file') }
        }
        Invoke-Falcon @Param
    }
}