lib/Events.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
## 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
    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
    $uri += '/tdstm/ws/moveEvent/list'

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

    ## Convert the results
    $Result = ($response.Content | ConvertFrom-Json).data

    ## Sort the Events Name
    $Result = $Result | Sort-Object -Property 'Name'

    ## Clear ID numbers
    if ($ResetIDs) {
        for ($i = 0; $i -lt $Result.Count; $i++) {
            $Result[$i].id = $null
        }
    }

    ## Return appropriate results
    if ($Name) {
        [TMEvent]::new(($Result | Where-Object { $_.name -eq $Name }))
    }
    else {
        $Result | ForEach-Object { [TMEvent]::new($_) }
    }
}

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 {
    }
}