Functions/New-AzDoTask.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
Function New-AzDoTask
{
<#
    .SYNOPSIS
        Creates a work item of the type Task
 
    .DESCRIPTION
        Creates a work item of the type Task
 
    .EXAMPLE
        New-AzDoTask -PersonalAccessToken $PAT -Organisation $Organisation -Project $Project -TaskTitle "Test Task" -Board $Board -Description "Test Description"
 
    .PARAMETER PersonalAccessToken
        This is your personal access token from Azuree Devops.
 
    .PARAMETER OrganizationName
        The name of your Azure Devops Organisation
 
    .PARAMETER ProjectName
        The name of your Azure Devops Project or Team
 
    .PARAMETER Title
        The title of the task
 
    .PARAMETER Board
        The name of your Azure Devops Board you want to add the item to
 
    .PARAMETER AssignedTo
        This is the person the item is assigned to.
 
    .PARAMETER Description
        The content of the description field. Lines can be broken by adding <br>
 
    .INPUTS
        Input is from command line or called from a script.
 
    .OUTPUTS
        This will output the logfile.
 
    .NOTES
        Version: 1.1
        Author: Lars Panzerbjørn
        Creation Date: 2020.07.31
        Purpose/Change: Initial script development
#>

    [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
    param
    (
        [Parameter(Mandatory)]
        [Alias('PAT')]
        [string]$PersonalAccessToken,

        [Parameter(Mandatory)]
        [Alias('Company')]
        [string]$Organisation,

        [Parameter(Mandatory)]
        [Alias('TeamName')]
        [string]$Project,

        [Parameter(Mandatory)]
        [Alias('Title')]
        [string]$TaskTitle,

        [Parameter()][string]$Board,
        
        [Parameter()][string]$AssignedTo,
        
        [Parameter()][string]$Description,
        
        [Parameter(Mandatory)]
        [string]$ParentItemID
    )

    BEGIN
    {
        Write-Verbose "Beginning $($MyInvocation.Mycommand)"
        $JsonContentType = 'application/json-patch+json'
        $BaseUri = "https://dev.azure.com/$($Organisation)/"
        $Uri = $BaseUri + "$Project/_apis/wit/workitems/`$Task?api-version=6.0"

        $Token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PersonalAccessToken)"))
        $Header = @{Authorization = 'Basic ' + $Token;accept=$JsonContentType}
    }

    PROCESS
    {
        Write-Verbose "Processing $($MyInvocation.Mycommand)"

        $Body = @([pscustomobject]@{
                op = "add"
                path = '/fields/System.Title'
                from = $Null
                value = $TaskTitle
            }
        )
        
        IF ($Board){$BoardValue = $Board}
        ELSE {$BoardValue = (Get-AzDoUserStoryWorkItem -Organisation $Organisation -WorkItemID $ParentID -PersonalAccessToken $PersonalAccessToken -Project $Project).Fields.'System.AreaPath'}
        $Body += @([pscustomobject]@{
                op = "add"
                path = '/fields/System.AreaPath'
                value = $BoardValue
            }
        )
    
        
        IF ($AssignedTo){$AssignedToValue = $AssignedTo}
        ELSE {$AssignedToValue = (Get-AzDoUserStoryWorkItem -Organisation $Organisation -WorkItemID $ParentID -PersonalAccessToken $PersonalAccessToken -Project $Project).Fields.'System.Assignedto'.displayName}
        $Body += @([pscustomobject]@{
                op = "add"
                path = '/fields/System.AssignedTo'
                value = $AssignedToValue
            }
        )

        IF ($Description)
        {
            $Body += @([pscustomobject]@{
                    op = "add"
                    path = '/fields/System.Description'
                    value = $Description
                }
            )
        }
        
        $Body = ConvertTo-Json $Body
        $Body
        $Result = Invoke-RestMethod -Uri $uri -Method POST -Headers $Header -ContentType "application/json-patch+json" -Body $Body
        
        IF (($ParentItemID) -and ($Result.id)){
            Link-AzDoItems -PersonalAccessToken $PersonalAccessToken -Organisation $Organisation -Project $Project -ParentItemID $ParentItemID -ChildItemID $Result.id -Verbose
        }

    }
    END
    {
        Write-Verbose "Ending $($MyInvocation.Mycommand)"
        #$Body
        $Result
    }
}