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
Get Ticket by Id
 
.DESCRIPTION
 
.PARAMETER Id
Id of ticket to get.
 
#>

function Get-FDTicket
{
    [CmdletBinding()]
    Param(
       [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
}


## 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
}