Freshdesk.psm1
$baseUrl = "https://guidnew.freshdesk.com/api/v2"; <# .SYNOPSIS Connects to Freshdesk. .DESCRIPTION Credentials can be persisted using https://www.powershellgallery.com/packages/CredentialsManager/ by setting the parameter UseCredentialsManager to $True. o $Credential -eq $Null -and $UseCredentialsManager -eq $Null -> credentials are requested and are not persisted o $Credential -ne $Null -and $UseCredentialsManager -eq $Null -> passed credentials are used and not persisted o $Credential -ne $Null -and $UseCredentialsManager -ne $Null -> passed credentials are used and persisted o $Credential -eq $Null -and $UseCredentialsManager -ne $Null -> Persisted credentials are used .PARAMETER Credential Credential to access Freshdesk with. I not provided they get requested. .PARAMETER UseCredentialsManager If $True, credentials are read and written using the CredentialsManager. Only Password part, containing the APIKey, is used. #> function Connect-FD { [CmdletBinding()] Param( [PSCredential]$Credential, [Boolean]$UseCredentialsManager = $False ) #end param # check module prerequisites if($UseCredentialsManager) { $module = Get-Module -ListAvailable -Name "CredentialsManager"; if (!$module) { throw "Module 'CredentialsManager' needed. Please install executing 'Install-Module -Name CredentialsManager' as Administrator."; } } if($UseCredentialsManager -and $Credential -eq $Null) { $Credential = Read-Credential -ListAvailable | Where { $_.Environment -eq "Freshdesk" } } if(!$Credential) { $Credential = Get-Credential -Message "Please enter API Key for Freshdesk as username (password can be anything)."; } if($UseCredentialsManager) { Write-Credential "Freshdesk" -Credential $Credential; } $script:base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Credential.UserName,$Credential.Password))) } <# .SYNOPSIS Get Tickets by Filter from Freshdesk .DESCRIPTION If no ticket is found, an empty array is returned. .PARAMETER FilterName Name of filter to get tickets for. #> function Get-FDTickets { [CmdletBinding()] Param( [string]$FilterName ) if(!$script:base64AuthInfo) { Connect-FD -UseCredentialsManager $True; } $parameters = @{ } if($Name) { $parameters.Add("filter", $FilterName) } $uri = New-HttpQueryString "${baseUrl}/tickets" $parameters $response = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $script:base64AuthInfo)}; return $response } <# .SYNOPSIS Modify a Ticket .DESCRIPTION .PARAMETER Id Id of ticket to get. .PARAMETER Mail Mail of Ticket requester. .PARAMETER Type Type to set ticket to. #> function Edit-FDTicket { [CmdletBinding()] Param( [Parameter(Mandatory=$true)][int]$Id, [string]$Mail, [string]$Type ) if(!$script:base64AuthInfo) { Connect-FD -UseCredentialsManager $True; } $parameters = @{ } $uri = New-HttpQueryString "${baseUrl}/tickets/${Id}" $parameters $body = @{}; if($Mail) { $body.Add("email", $Mail) } if($Type) { $body.Add("type", $Type) } $bodyAsJson = ConvertTo-JSON( $body ); $response = Invoke-RestMethod -Uri $uri -Method Put -Body $bodyAsJson -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $script:base64AuthInfo)}; return $response } <# .SYNOPSIS Get Ticket by Id .DESCRIPTION .PARAMETER Id Id of ticket to get. #> function Get-FDTicket { [CmdletBinding()] Param( [Parameter(Mandatory=$true)][int]$Id ) if(!$script:base64AuthInfo) { Connect-FD -UseCredentialsManager $True; } $parameters = @{ } $uri = New-HttpQueryString "${baseUrl}/tickets/${Id}" $parameters $response = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $script:base64AuthInfo)}; return $response } <# .SYNOPSIS Get Contact by Id .DESCRIPTION .PARAMETER Id Id of contact to receive. #> function Get-FDContact { [CmdletBinding()] Param( [Parameter(Mandatory=$true)][string]$Id ) if(!$script:base64AuthInfo) { Connect-FD -UseCredentialsManager $True; } $parameters = @{ } $uri = New-HttpQueryString "${baseUrl}/contacts/${Id}" $parameters $response = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $script:base64AuthInfo)}; return $response } <# .SYNOPSIS Get Contact by Mail .DESCRIPTION .PARAMETER Mail Mail of contact to receive. #> function Get-FDContactByMail { [CmdletBinding()] Param( [Parameter(Mandatory=$true)][string]$Mail ) if(!$script:base64AuthInfo) { Connect-FD -UseCredentialsManager $True; } $parameters = @{ "query"="`"email:'${Mail}'`""} $uri = New-HttpQueryString "${baseUrl}/search/contacts" $parameters $response = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $script:base64AuthInfo)}; if($response.total -eq 0) { return @(); } return $response.results } ## Private Functions function New-HttpQueryString { [CmdletBinding()] param ( [Parameter(Mandatory = $true)][String]$Uri, [Parameter(Mandatory = $true)][Hashtable]$QueryParameter ) # Add System.Web Add-Type -AssemblyName System.Web # Create a http name value collection from an empty string $nvCollection = [System.Web.HttpUtility]::ParseQueryString([String]::Empty) foreach ($key in $QueryParameter.Keys) { $nvCollection.Add($key, $QueryParameter.$key) } # Build the uri $uriRequest = [System.UriBuilder]$uri $uriRequest.Query = $nvCollection.ToString() return $uriRequest.Uri.OriginalString } |