lib/Events.ps1

## Events
Function Get-TMEvent {
    [OutputType([TMEvent])]
    param(
        [Parameter(Mandatory = $false)][String]$Name,
        [Parameter(Mandatory = $false)][String]$TMSession = 'Default',
        [Parameter(Mandatory = $false)][int]$ProjectId = $global:TMSessions[$TMSession].UserContext.project.id,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)]$AllowInsecureSSL = $global:TMSessions[$TMSession].AllowInsecureSSL,
        [Parameter(Mandatory = $false)][Switch]$ResetIDs

    )

    ## Get Session Configuration
    $TMSessionConfig = $global:TMSessions[$TMSession]
    if (-not $TMSessionConfig) {
        Write-Host 'TMSession: [' -NoNewline
        Write-Host $TMSession -ForegroundColor Cyan
        Write-Host '] was not Found. Please use the New-TMSession command.'
        Throw 'TM Session Not Found. Use New-TMSession command before using features.'
    }

    #Honor SSL Settings
    $TMCertSettings = @{ SkipCertificateCheck = $TMSessionConfig.AllowInsecureSSL }

    # Extract the host name and make up the URI
    [string] $instance = $Server -replace '/tdstm.*|https?://', ''
    [string] $uri = '{0}{1}{2}{3}{4}' -f 'https://', $instance, '/tdstm/api/event', '?project=', $ProjectId

    try {
        $response = Invoke-WebRequest -Method Get -Uri $uri -WebSession $TMSessionConfig.TMWebSession @TMCertSettings -Headers $TMSessionConfig.TMRestSession.Headers
    }
    catch {
        return $_
    }
    if ($response.StatusCode -ne 200) {
        throw ('There was an error retriving the event list.' + $_.Exception.Message)
    }

    ## Convert the results and sort them
    [PSCustomObject[]] $Results = $response.Content | ConvertFrom-Json
    if (-not $Results.Count) {
        Write-Host "No events found in session: '$TMSessionConfig'" -ForegroundColor Yellow
        return
    }
    $Results = $Results | Sort-Object -Property 'Name'

    ## In order not to modify the TMEvent.ps1 constructor, copying 'tags' into 'addTags'
    foreach ($result in $Results) {
        $result | Add-Member -MemberType NoteProperty -Name 'addTags' -Value $result.Tags
    }

    ## Clear ID numbers
    if ($ResetIDs) {
        foreach ($result in $Results) {
            $result.id = $null
        }
    }

    ## Return appropriate results
    if ($Name) {
        $Results = $Results | Where-Object Name -EQ $Name
    }
    foreach ($result in $Results) {
        [TMEvent]::new($result)
    }    
}

function New-TMEvent {
    <#
    .SYNOPSIS
    Creates a new Event in TransitionManager
 
    .DESCRIPTION
    This function creates a new Event in TransitionManager
 
    .PARAMETER InputObject
    The Event to create.
 
    .PARAMETER Name
    The name for the Event
 
    .PARAMETER Description
    The description for the Event
 
    .EXAMPLE
    New-TMEvent -Name 'New Event #5'
 
    .EXAMPLE
    New-TMEvent -InputObject @{name = 'Event name'; description = 'Event Description'}
 
    .EXAMPLE
    [TMEvent]::new('First Event') | New-TMEvent -Passthru
 
 
    .OUTPUTS
    This command does not provide output.
    #>


    [CmdletBinding(DefaultParameterSetName = 'ByProperties')]
    [OutputType([TMEvent])]
    param(
        [Parameter(Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ParameterSetName = 'ByObject')]
        [TMEvent]
        $InputObject,

        [Parameter(Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'ByProperties')]
        [String]$Name,

        [Parameter(Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'ByProperties')]
        [psobject[]]$Tags,

        [Parameter(Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'ByProperties')]
        [String]$Description,

        [Parameter(Mandatory = $false)][String]$TMSession = 'Default',
        [Parameter(Mandatory = $false)][int]$ProjectId = $global:TMSessions[$TMSession].UserContext.project.id,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)]$AllowInsecureSSL = $global:TMSessions[$TMSession].AllowInsecureSSL,

        [Parameter(Mandatory = $false)][Switch]$PassThru
    )

    begin {

        ## Get Session Configuration
        $TMSessionConfig = $global:TMSessions[$TMSession]
        if (-not $TMSessionConfig) {
            Write-Host 'TMSession: [' -NoNewline
            Write-Host $TMSession -ForegroundColor Cyan
            Write-Host '] was not Found. Please use the New-TMSession command.'
            Throw 'TM Session Not Found. Use New-TMSession command before using features.'
        }

        #Honor SSL Settings
        if ($TMSessionConfig.AllowInsecureSSL) {
            $TMCertSettings = @{SkipCertificateCheck = $true }
        }
        else {
            $TMCertSettings = @{SkipCertificateCheck = $false }
        }


        $instance = $Server.Replace('/tdstm', '')
        $instance = $instance.Replace('https://', '')
        $instance = $instance.Replace('http://', '')

        $uri = 'https://'
        $uri += $instance + '/tdstm/ws/moveEvent/save/null'
    }

    process {
        Write-Verbose "ParameterSet = $($PSCmdlet.ParameterSetName)"

        ## Handle the Parameter Creation based on the set
        $TMEvent = $PSCmdlet.ParameterSetName -eq 'ByProperties' ? [TMEvent]::new($Name, $Description, $Tags) : $InputObject

        ## Write the new Event that will be created
        Write-Verbose ($TMEvent | ConvertTo-Json)

        ## Update the Content Type to JSON
        Set-TMHeaderContentType -ContentType 'JSON' -TMSession $TMSession

        ## Check for an existing Event
        $CheckEvent = Get-TMEvent -Name $TMEvent.name -TMSession $TMSession
        if (-Not [String]::IsNullOrEmpty($CheckEvent.name)) {
            if ($Passtrhu) { return $CheckEvent }
            return
        }

        ## Create a Request Splat
        $WebRequestSplat = @{
            Method     = 'POST'
            Uri        = $uri
            WebSession = $TMSessionConfig.TMWebSession
            Body       = ($TMEvent | ConvertTo-Json)
        }

        try {
            $response = Invoke-WebRequest @WebRequestSplat @TMCertSettings
            if ($response.StatusCode -eq 200 ) {
                $ResponseContent = $response.content | ConvertFrom-Json
                if ($ResponseContent.status -ne 'success') {
                    Write-Error -Message $ResponseContent.errors[0]
                    return
                }
                else {

                    ## The Object was returned, pass it through to
                    if ($PassThru) {
                        return [TMEvent]::new($ResponseContent.data)
                    }
                    else { return }
                }
            }
            elseif ($response.StatusCode -eq 204) {
                return (Get-TMEvent -Name $TMEvent.name)
            }
            else {
                throw 'Unable to Create Event'
            }
        }
        catch {
            throw $_
        }
    }

    end {
    }
}