Public/Add-JiraIssueAttachment.ps1
function Add-JiraIssueAttachment { # .ExternalHelp ..\JiraPS-help.xml [CmdletBinding( SupportsShouldProcess )] param( [Parameter( Mandatory )] [ValidateNotNullOrEmpty()] [ValidateScript( { if (("JiraPS.Issue" -notin $_.PSObject.TypeNames) -and (($_ -isnot [String]))) { $exception = ([System.ArgumentException]"Invalid Type for Parameter") #fix code highlighting] $errorId = 'ParameterType.NotJiraIssue' $errorCategory = 'InvalidArgument' $errorTarget = $_ $errorItem = New-Object -TypeName System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $errorTarget $errorItem.ErrorDetails = "Wrong object type provided for Issue. Expected [JiraPS.Issue] or [String], but was $($_.GetType().Name)" $PSCmdlet.ThrowTerminatingError($errorItem) <# #ToDo:CustomClass Once we have custom classes, this check can be done with Type declaration #> } else { return $true } } )] [Alias('Key')] [Object] $Issue, <# #ToDo:CustomClass Once we have custom classes, this can also accept ValueFromPipeline #> [Parameter( Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName )] [ValidateScript( { if (-not (Test-Path $_ -PathType Leaf)) { $exception = ([System.ArgumentException]"File not found") #fix code highlighting] $errorId = 'ParameterValue.FileNotFound' $errorCategory = 'ObjectNotFound' $errorTarget = $_ $errorItem = New-Object -TypeName System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $errorTarget $errorItem.ErrorDetails = "No file could be found with the provided path '$_'." $PSCmdlet.ThrowTerminatingError($errorItem) } else { return $true } } )] [Alias('InFile', 'FullName', 'Path')] [String[]] $FilePath, [Parameter()] [System.Management.Automation.PSCredential] [System.Management.Automation.Credential()] $Credential = [System.Management.Automation.PSCredential]::Empty, [Switch] $PassThru ) begin { Write-Verbose "[$($MyInvocation.MyCommand.Name)] Function started" $resourceURi = "{0}/attachments" } process { Write-DebugMessage "[$($MyInvocation.MyCommand.Name)] ParameterSetName: $($PsCmdlet.ParameterSetName)" Write-DebugMessage "[$($MyInvocation.MyCommand.Name)] PSBoundParameters: $($PSBoundParameters | Out-String)" if (@($Issue).Count -ne 1) { $exception = ([System.ArgumentException]"invalid Issue provided") $errorId = 'ParameterValue.JiraIssue' $errorCategory = 'InvalidArgument' $errorTarget = $_ $errorItem = New-Object -TypeName System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $errorTarget $errorItem.ErrorDetails = "Only one Issue can be provided at a time." $PSCmdlet.ThrowTerminatingError($errorItem) } # Find the proper object for the Issue $issueObj = Resolve-JiraIssueObject -InputObject $Issue -Credential $Credential foreach ($file in $FilePath) { $file = Resolve-FilePath -Path $file $enc = [System.Text.Encoding]::GetEncoding("iso-8859-1") $boundary = [System.Guid]::NewGuid().ToString() $fileName = Split-Path -Path $file -Leaf $readFile = [System.IO.File]::ReadAllBytes($file) $fileEnc = $enc.GetString($readFile) $bodyLines = @' --{0} Content-Disposition: form-data; name="file"; filename="{1}" Content-Type: application/octet-stream {2} --{0}-- '@ -f $boundary, $fileName, $fileEnc $headers = @{ 'X-Atlassian-Token' = 'nocheck' 'Content-Type' = "multipart/form-data; boundary=`"$boundary`"" } $parameter = @{ URI = $resourceURi -f $issueObj.RestURL Method = "POST" Body = $bodyLines Headers = $headers RawBody = $true Credential = $Credential } Write-Debug "[$($MyInvocation.MyCommand.Name)] Invoking JiraMethod with `$parameter" if ($PSCmdlet.ShouldProcess($IssueObj.Key, "Adding attachment '$($fileName)'.")) { $rawResult = Invoke-JiraMethod @parameter if ($PassThru) { Write-Output (ConvertTo-JiraAttachment -InputObject $rawResult) } } } } end { Write-Verbose "[$($MyInvocation.MyCommand.Name)] Complete" } } |