Public/Assistance/Tickets/Add-GlpiToolsTicketItem.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
<#
.SYNOPSIS
    Add an item to an existing ticket
.DESCRIPTION
    This function will add an item to an existing ticket.
 
.PARAMETER ticket_id
    The ticket id this item will be added to
 
.PARAMETER item_id
    The item id
    Requires item_type to be specified
 
.PARAMETER item_type
    The item type that is added.
    These are the default types GLPI provides
 
.EXAMPLE
    PS C:\> Add-GlpiToolsTicketItem -ticket_id 165 -item_id 4609 -item_type Computer
 
.EXAMPLE
    PS C:\> Add-GlpiToolsTicketItem -ticket_id 165 -item_id 4609 -item_type NetworkEquipment
 
.OUTPUTS
    Function returns PSCustomObject with id's and messages from the GLPI API
.NOTES
    Author: Ron Peeters
    Date: 20200708
    Version: 1.0.0
#>


function Add-GlpiToolsTicketItem {
    [CmdletBinding()]
    param (
        [parameter(
            Mandatory = $true,
            Position = 0,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "ticket id from GLPI"
        )]
        [alias('TID')]
        [int]$ticket_id,

        [parameter(
            Mandatory = $true,
            Position = 1,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "item id from GLPI"
        )]
        [int]$item_id,

        [parameter(
            Mandatory = $true,
            Position = 2,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "item type specified at item_id"
        )]
        [ValidateScript( {
                $ModulePath = Split-Path (Get-Module -Name GlpiTools).Path -Parent
                $Values = (Get-Content "$($ModulePath)\Private\Parameters.json" | ConvertFrom-Json).GlpiComponents
                If ($Values -notcontains $_) {
                    Write-Warning -Message "Invalid item type specified. Possible values for item_type are: $Values"
                    throw "Invalid item type specified."
                
                } else {
                    $true
                }
            })]
        [string]$item_type

        # Specifies a path to one or more locations. Unlike the Path parameter, the value of the LiteralPath parameter is
        # used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters,
        # enclose it in single quotation marks. Single quotation marks tell Windows PowerShell not to interpret any
        # characters as escape sequences.


    )
    
    begin {

        $AppToken = $Script:AppToken
        $PathToGlpi = $Script:PathToGlpi
        $SessionToken = $Script:SessionToken

        $AppToken = Get-GlpiToolsConfig -Verbose:$false | Select-Object -ExpandProperty AppToken
        $PathToGlpi = Get-GlpiToolsConfig -Verbose:$false | Select-Object -ExpandProperty PathToGlpi
        $SessionToken = Set-GlpiToolsInitSession -Verbose:$false | Select-Object -ExpandProperty SessionToken

        #$ChoosenParam = ($PSCmdlet.MyInvocation.BoundParameters).Keys

        $Output = [System.Collections.Generic.List[PSObject]]::New()
    }
    
    process {

        Try {
            Write-Verbose "Invoking API to add Item with id $($Item_id) of type $item_type to ticket $ticket_id"
            # "items_id":'.$Itemid.',"itemtype":"Item","tickets_id":'.$ticketid.'}

            $hashAddItemtoTicket = @{
                items_id   = $item_id
                itemtype   = $item_type
                tickets_id = $ticket_id
            
            }
            $GlpiUpload = $hashAddItemtoTicket | ConvertTo-Json
            $Upload = '{ "input" : ' + $GlpiUpload + '}'

            $params = @{
                headers = @{
                    'Content-Type'  = 'application/json'
                    'App-Token'     = $AppToken
                    'Session-Token' = $SessionToken
                }
                method  = 'post'
                uri     = "$($PathToGlpi)/Ticket/$ticket_id/Item_ticket/"
                body    = ([System.Text.Encoding]::UTF8.GetBytes($Upload))
            }

            $GlpiTicketAddItem = Invoke-RestMethod @params -ErrorAction Stop
            Write-Verbose $GlpiTicketAddItem

            If ($GlpiTicketAddItem -match "</body>") {
                $GlpiTicketAddItem = $GlpiTicketAddItem.split(">")[-1] | ConvertFrom-JSON
            } else {
                #Do nothing
            }

            $Output.Add($GlpiTicketAddItem)


        } Catch {
            Write-Error -Message "Unable to add item to ticket."
            Write-Error $_
        }
    }

    end {
        $Output
        $Output = [System.Collections.Generic.List[PSObject]]::New()
        Set-GlpiToolsKillSession -SessionToken $SessionToken -Verbose:$false
    }
}

$ItemTypeValidate = {
    param ($commandName, $parameterName, $stringMatch)
    $ModulePath = Split-Path (Get-Module -Name GlpiTools).Path -Parent
    (Get-Content "$($ModulePath)\Private\Parameters.json" | ConvertFrom-Json).GlpiComponents | Where-Object { $_ -match "$stringMatch" }
}
Register-ArgumentCompleter -CommandName Add-GlpiToolsTicketItem -ParameterName item_type -ScriptBlock $ItemTypeValidate