Public/New-RTTicket.ps1

Function New-RTTicket {
    <#
    .SYNOPSIS
        Create a new ticket in RT
    .DESCRIPTION
        Create a new ticket in RT
    .PARAMETER Requestor
        Ticket requestor
    .PARAMETER Owner
        Ticket Owner
    .PARAMETER Priority
        Ticket Priority. Defaults to 0
    .PARAMETER Subject
        Ticket Subject
    .PARAMETER Text
        Ticket Text. For multiline, add a single space to the start of every line after the first line
    .PARAMETER Queue
        Ticket Queue. Defaults to General
    .PARAMETER Cc
        Ticket Cc
    .PARAMETER AdminCc
        Ticket AdminCc
    .PARAMETER Status
        Ticket Status
    .PARAMETER InputHash
        Add additional ticket properties to this hashtable.
 
        These values are overridden if an explicit parameter is also specified. e.g.
            -Owner wframe -InputObject @{Owner = 'Nope'}
            Result: Owner: wframe
    .PARAMETER Referer
        Referer to use for whitelisting purposes. Defaults to PSRTConfig.Referer (Created by New-RTSession)
         
        See @ReferrerWhitelist RT configuration if you run into CSRF errors
        If you specify 'https://<hostname>', RT (and its whitelist) use <hostname>:443
    .PARAMETER Session
        RT session to use. Defaults to PSRTConfig.Session (Created by New-RTSession)
    .PARAMETER BaseUri
        Base URI for RT. Defaults to PSRTConfig.BaseUri (Created by New-RTSession)
    .PARAMETER Raw
        If specified, do not parse output
    .EXAMPLE
        New-RTTicket -Requestor wframe -Owner wframe -Subject 'TEST' -Text 'This is a ticket!'
    .EXAMPLE
        $Text = @"
        This is
         a
         multiline
         ticket!
        "@ # note the single space before each line after the first.
 
        New-RTTicket -Queue SomeOtherQueue -InputHash @{
            Requestor = 'wframe'
            Subject = 'Test'
            Text = $Text
            'CF-CustomField' = 'Custom!'
        }
 
    .FUNCTIONALITY
        Request Tracker
    #>

    [cmdletbinding()]
    Param(
        [string]$Requestor,
        [string]$Owner,
        [int]$Priority = 0,
        [string]$Subject,
        [string]$Text,
        [string]$Queue = 'General',
        [hashtable]$InputHash,
        [string]$Cc,
        [string]$AdminCc,
        [string]$Status,
        [string]$Referer = $PSRTConfig.Referer,

        [Parameter( ValueFromPipeLine = $true, 
            ValueFromPipelineByPropertyName = $true )] 
        [ValidateNotNull()] 
        [Microsoft.PowerShell.Commands.WebRequestSession] 
        $Session = $PSRTConfig.Session,
        [ValidateNotNull()] 
        [string]$BaseUri = $PSRTConfig.BaseUri,
        [switch]$Raw
    )
    $InvokeParams = @{ WebSession = $Session; UseBasicParsing = $true }
    if($Referer)
    {
        $headers = @{}
        $headers.Add('Referer', $Referer)
        $InvokeParams.Add('Headers', $headers)
    }
    $uri = Join-Parts -Separator '/' -Parts $BaseUri, "/REST/1.0/ticket/new"
    
    # Merge explicit parameters into InputHash, with explicit param values taking precedent
    $Parameters = . Get-ParameterValues
    if(-not $PSBoundParameters.ContainsKey('InputHash'))
    {
        $InputHash = @{}
    }
    Write-Output Requestor,
                 Owner,
                 Priority,
                 Subject,
                 Text,
                 Queue,
                 Cc,
                 AdminCc,
                 Status |
        Foreach-Object {
            $Property = $_
            if($Parameters.containskey($Property))
            {
                $InputHash.Set_Item($Property, $Parameters[$Property])
            }
        }
    
    # Build up content for ticket
    # Queue must come last. wtf RT. https://stackoverflow.com/a/29540271
    $Content = ''
    foreach($Key in $InputHash.Keys)
    {
        if($Key -ne 'Queue')
        {
            $Content += "$Key`: $($InputHash[$Key])`n"
        }
        #Later: Handle odd custom fields
    }
    $Content += "Queue: $($InputHash['Queue'])`n"

    $InvokeParams.Add('Body', @{content=$Content})
    Write-Verbose "$($InvokeParams | Out-String)`n$($Content | Out-String)"
    $Response = ( Invoke-WebRequest @InvokeParams -Uri $uri -Method Post).Content
    if ($Raw) {
        $Response
    }
    else {
        ConvertFrom-RTResponse -Content $Response
    }
}