Public/Add-JiraIssueWorklog.ps1
function Add-JiraIssueWorklog { <# .Synopsis Adds a worklog item to an existing JIRA issue .DESCRIPTION This function adds a worklog item to an existing issue in JIRA. You can optionally set the visibility of the item (All Users, Developers, or Administrators). .EXAMPLE Add-JiraIssueWorklog -Comment "Test comment" -Issue "TEST-001" -TimeSpent 60 -DateStarted (Get-Date) This example adds a simple worklog item to the issue TEST-001. .EXAMPLE Get-JiraIssue "TEST-002" | Add-JiraIssueWorklog "Test worklog item from PowerShell" -TimeSpent 60 -DateStarted (Get-Date) This example illustrates pipeline use from Get-JiraIssue to Add-JiraIssueWorklog. .EXAMPLE Get-JiraIssue -Query 'project = "TEST" AND created >= -5d' | % { Add-JiraIssueWorklog "This issue has been cancelled per Vice President's orders." -TimeSpent 60 -DateStarted (Get-Date)} This example illustrates logging work on all projects which match a given JQL query. It would be best to validate the query first to make sure the query returns the expected issues! .EXAMPLE $comment = Get-Process | Format-Jira Add-JiraIssueWorklog $c -Issue TEST-003 -TimeSpent 60 -DateStarted (Get-Date) This example illustrates adding a comment based on other logic to a JIRA issue. Note the use of Format-Jira to convert the output of Get-Process into a format that is easily read by users. .INPUTS This function can accept JiraPS.Issue objects via pipeline. .OUTPUTS This function outputs the JiraPS.Worklogitem object created. .NOTES This function requires either the -Credential parameter to be passed or a persistent JIRA session. See New-JiraSession for more details. If neither are supplied, this function will run with anonymous access to JIRA. #> [CmdletBinding()] param( # Worklog item that should be added to JIRA [Parameter(Mandatory = $true, Position = 0)] [String] $Comment, # Issue to receive the new worklog item [Parameter(Mandatory = $true, Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [Alias('Key')] [Object] $Issue, # Time spent to be logged [Parameter(Mandatory = $true, Position = 2, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [TimeSpan] $TimeSpent, # Date/time started to be logged [Parameter(Mandatory = $true, Position = 3, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [DateTime] $DateStarted, # Visibility of the comment - should it be publicly visible, viewable to only developers, or only administrators? [ValidateSet('All Users','Developers','Administrators')] [String] $VisibleRole = 'Developers', # Credentials to use to connect to Jira. If not specified, this function will use [Parameter(Mandatory = $false)] [System.Management.Automation.PSCredential] $Credential ) begin { Write-Debug "[Add-JiraIssueWorklog] Begin" # We can't validate pipeline input here, since pipeline input doesn't exist in the Begin block. } process { Write-Debug "[Add-JiraIssueWorklog] Checking Issue parameter" if ($Issue.PSObject.TypeNames[0] -eq 'JiraPS.Issue') { Write-Debug "[Add-JiraIssueWorklog] Issue parameter is a JiraPS.Issue object" $issueObj = $Issue } else { $issueKey = $Issue.ToString() Write-Debug "[Add-JiraIssueWorklog] Issue key is assumed to be [$issueKey] via ToString()" Write-Verbose "Searching for issue [$issueKey]" try { $issueObj = Get-JiraIssue -Key $issueKey -Credential $Credential } catch { $err = $_ Write-Debug 'Encountered an error searching for Jira issue. An exception will be thrown.' throw $err } } if (-not $issueObj) { Write-Debug "[Add-JiraIssueWorklog] No Jira issues were found for parameter [$Issue]. An exception will be thrown." throw "Unable to identify Jira issue [$Issue]. Does this issue exist?" } #Write-Debug "[Add-JiraIssueWorklog] Obtaining a reference to Jira issue [$Issue]" #$issueObj = Get-JiraIssue -InputObject $Issue -Credential $Credential $url = "$($issueObj.RestURL)/worklog" Write-Debug "[Add-JiraIssueWorklog] Creating request body from comment" $props = @{ 'comment' = $Comment; 'started' = $DateStarted.ToString(); 'timeSpent' = $TimeSpent.TotalSeconds.ToString(); } # If the visible role should be all users, the visibility block shouldn't be passed at # all. JIRA returns a 500 Internal Server Error if you try to pass this block with a # value of "All Users". if ($VisibleRole -ne 'All Users') { $props.visibility = @{ 'type' = 'role'; 'value' = $VisibleRole; } } Write-Debug "[Add-JiraIssueWorklog] Converting to JSON" $json = ConvertTo-Json -InputObject $props Write-Debug "[Add-JiraIssueWorklog] Preparing for blastoff!! $json" $rawResult = Invoke-JiraMethod -Method Post -URI $url -Body $json -Credential $Credential Write-Debug "[Add-JiraIssueWorklog] Converting to custom object" $result = ConvertTo-JiraWorklogitem -InputObject $rawResult Write-Debug "[Add-JiraIssueWorklog] Outputting result" Write-Output $result } end { Write-Debug "[Add-JiraIssueWorklog] Complete" } } |