Project

General

Profile

Rest api with powershell » History » Version 6

Seung Soo Mun, 2020-10-24 20:57

1 1 Seung Soo Mun
h1. Using the REST API with Powershell
2
3 3 Seung Soo Mun
h2. Powershell
4 1 Seung Soo Mun
5 3 Seung Soo Mun
"Invoke-RestMethod":https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod cmdlet
6
7 1 Seung Soo Mun
<pre>
8
$Cred = Get-Credential
9
10
Invoke-RestMethod http://demo.redmine.org/issues/12345.json -Credential $Cred
11
Invoke-RestMethod http://demo.redmine.org/projects/12.json -Credential $Cred
12
Invoke-RestMethod http://demo.redmine.org/versions/123.json -Credential $Cred
13
14
(Invoke-RestMethod http://demo.redmine.org/issues.json -Credential $Cred).issues
15
(Invoke-RestMethod http://demo.redmine.org/projects.json -Credential $Cred).projects
16
(Invoke-RestMethod http://demo.redmine.org/projects/12/versions.json -Credential $Cred).versions
17
18
Invoke-RestMethod http://demo.redmine.org/projects/12.json -Credential $Cred -Method PUT -ContentType 'application/json' -Body '{"project": {"default_version_id": "398"}}'
19
Invoke-RestMethod http://demo.redmine.org/projects/testproject.json -Credential $Cred -Method PUT -ContentType 'application/json' -Body '{"project": {"default_version_id": "398"}}'
20 2 Seung Soo Mun
21
Invoke-RestMethod http://demo.redmine.org/projects/12/versions.json -Credential $Cred -Method POST -ContentType 'application/json' -Body '{"version": {"name": "Test ver", "description": "Test version desc"}}'
22 1 Seung Soo Mun
Invoke-RestMethod http://demo.redmine.org/issues.json -Credential $Cred -Method POST -ContentType 'application/json' -Body '{"issue": {"project_id": 438, "subject": "test watchers", "watcher_user_ids": [7,11,110]}}'
23
</pre>
24
25 3 Seung Soo Mun
h2. using PSRedmine module
26 1 Seung Soo Mun
27
https://github.com/hamletmun/PSRedmine
28
29 3 Seung Soo Mun
{{collapse(Example)
30 1 Seung Soo Mun
<pre>
31
Connect-Redmine demo.redmine.org
32
33
New-RedmineResource project -identifier test99 -name testproject
34
New-RedmineResource version -project_id 475 -name testversion
35
New-RedmineResource issue -project_id test99 -subject testissue
36
37
Search-RedmineResource project -keyword testproject
38
Search-RedmineResource membership -project_id test99
39
Search-RedmineResource version -project_id test99 -keyword testversion 
40
Search-RedmineResource issue -keyword testissue
41
Search-RedmineResource user -keyword testuser # Administrator only
42
43
Get-RedmineResource project test99
44
Get-RedmineResource project 475
45
Get-RedmineResource membership 74
46
Get-RedmineResource version 408
47
Get-RedmineResource issue 29552
48
Get-RedmineResource user 20 # Administrator only
49
50
Edit-RedmineResource project -id test99 -description 'change description'
51
Edit-RedmineResource version -id 408 -description 'add desc' -due_date 2018-09-29
52
Edit-RedmineResource issue -id 29552 -version_id 406
53
54
Remove-RedmineResource issue 29552
55
Remove-RedmineResource version 408
56
Remove-RedmineResource project test99 # Administrator only
57
Remove-RedmineResource user 20 # Administrator only
58
59
Disconnect-Redmine
60
</pre>
61 3 Seung Soo Mun
}}
62
63
h2. using Redmine-net-api dll
64
65 4 Seung Soo Mun
https://github.com/JamesNK/Newtonsoft.Json
66 3 Seung Soo Mun
https://github.com/zapadi/redmine-net-api
67
68
{{collapse(Example)
69
<pre>
70
[Reflection.Assembly]::LoadFile("C:\Absolute\Path\to\Newtonsoft.Json.dll")
71
[Reflection.Assembly]::LoadFile("C:\Absolute\Path\to\redmine-net-api.dll")
72
73
$Redmine = [Redmine.Net.Api.RedmineManager]::new('http://demo.redmine.org', 'a1b2c3d4e5f6g7h8i9j0a1b2c3d4e5f6g7h8i9j0')
74
$Redmine.GetCurrentUser()
75
76
[System.Collections.Specialized.NameValueCollection]$params
77
78
Function Get-RedmineResource ($type,$id) {
79
    $id = $id -as [String]
80 6 Seung Soo Mun
    $Redmine.GetType().GetMethod("GetObject").MakeGenericMethod("Redmine.Net.Api.Types.$type").Invoke($Redmine, @($id,$params))
81 3 Seung Soo Mun
}
82
83
Function Edit-RedmineResource ($type,$id,$description) {
84
    $id = $id -as [String]
85
    $resource = Get-RedmineResource $type $id
86
    $resource.description = $description
87
    ($Redmine.GetType().GetMethods() | where {$_.Name -eq "UpdateObject" -and $_.IsGenericMethod})[0].MakeGenericMethod("Redmine.Net.Api.Types.$type").Invoke($Redmine, @($id,$resource))
88
}
89
90
Function Remove-RedmineResource ($type,$id) {
91
    $id = $id -as [String]
92
    $Redmine.GetType().GetMethod("DeleteObject").MakeGenericMethod("Redmine.Net.Api.Types.$type").Invoke($Redmine, @($id,$null))
93
}
94
95 5 Seung Soo Mun
Function New-IdentifiableName ($id) {
96
    $IdentifiableName = New-Object -TypeName Redmine.Net.Api.Types.IdentifiableName
97
    $IdentifiableName.GetType().GetMethod("Create").MakeGenericMethod("Redmine.Net.Api.Types.IdentifiableName").Invoke($IdentifiableName, @($id -as [Int]))
98
}
99 1 Seung Soo Mun
100 5 Seung Soo Mun
Function New-RedmineResource {
101
    Param(
102
        [Parameter(Mandatory=$true)][String]$type,
103
        [String]$project_id,
104
        [String]$identifier,
105
        [String]$name,
106
        [String]$description,
107
        [Int]$default_version_id,
108
        [Int]$issue_id,
109
        [Int]$tracker_id,
110
        [String]$status_id,
111
        [Int]$version_id,
112
        [String]$subject,
113
        [String]$notes,
114
        [Datetime]$due_date,
115
        [String]$status,
116
        [String]$sharing
117
    )
118
    $hash = @{}
119 1 Seung Soo Mun
120 5 Seung Soo Mun
    foreach ($boundparam in $PSBoundParameters.GetEnumerator()) {
121
        Switch ($boundparam.Key) {
122
            'type' { continue }
123
            'project_id' { $hash.Project = New-IdentifiableName $boundparam.Value }
124
            'tracker_id' { $hash.Tracker = New-IdentifiableName $boundparam.Value }
125
            'status_id' { $hash.Status = New-IdentifiableName $boundparam.Value }
126
            'version_id' { $hash.Version = New-IdentifiableName $boundparam.Value }
127
            default { $hash.$($boundparam.Key) = $boundparam.Value }
128
        }
129
    }
130 1 Seung Soo Mun
    #$hash = @{ Name = $name; Identifier = $name; Description = 'Test' }
131
    $resource = New-Object -TypeName Redmine.Net.Api.Types.$type -Property $hash
132 6 Seung Soo Mun
    ($Redmine.GetType().GetMethods() | where {$_.Name -eq "CreateObject" -and $_.IsGenericMethod})[0].MakeGenericMethod("Redmine.Net.Api.Types.$type").Invoke($Redmine, @($resource -as ("Redmine.Net.Api.Types.$type" -as [type])))
133 1 Seung Soo Mun
}
134
135 5 Seung Soo Mun
$Project = New-RedmineResource Project -Identifier 'test_api' -Name 'test_api' -Description 'Testing Redmine-API'
136 6 Seung Soo Mun
$Issue = New-RedmineResource Issue -project_id $Project.Id -Subject 'test_api'
137 5 Seung Soo Mun
138 6 Seung Soo Mun
Get-RedmineResource Issue $Issue.Id
139 5 Seung Soo Mun
140 6 Seung Soo Mun
Edit-RedmineResource Issue $Issue.Id -Description 'Testing Redmine-API'
141
Get-RedmineResource Issue $Issue.Id
142 5 Seung Soo Mun
143 6 Seung Soo Mun
Remove-RedmineResource Issue $Issue.Id
144 3 Seung Soo Mun
</pre>
145
}}