Public/Problems/Get-FreshServiceProblem.ps1

<#
.SYNOPSIS
    Returns a Freshservice Problem.
 
.DESCRIPTION
    Returns a Freshservice Problem via REST API.
 
    https://api.freshservice.com/#view_a_problem
 
.PARAMETER Id
    Unique id of the Problem.
 
.PARAMETER workspace_id
    Workspace ID of the Problem. The attribute is applicable only for accounts with the Workspaces feature enabled. The default value is the ID of the primary workspace of the account.
 
.PARAMETER Fields
    View all the built-in and custom fields for Problem.
 
.PARAMETER per_page
    Number of records to return per page during pagination. Maximum of 100 records.
 
.PARAMETER page
    The page number to retrieve during pagination.
 
.EXAMPLE
    Get-FreshServiceProblem
 
    id : 2
    agent_id :
    description : <div>A new problem</div>
    description_text : A new problem
    assets : {}
    requester_id : 21000418005
    subject : A new problem
    group_id :
    priority : 1
    impact : 1
    status : 1
    due_by : 1/14/2023 6:55:51 PM
    known_error : False
    department_id :
    category :
    sub_category :
    item_category :
    created_at : 1/9/2023 6:55:57 PM
    updated_at : 1/9/2023 6:55:57 PM
 
    id : 1
    agent_id :
    description : <div>Hi guys, <br/><br/>We have been facing issues when we try to reach Email Server 3. Looks
                    like there is something wrong here.<br/><br/>Regards<br/> Rachel<br/> </div>
    description_text :
    assets : {}
    requester_id : 21000418008
    subject : Unable to reach email server
    group_id :
    priority : 1
    impact : 1
    status : 1
    due_by : 9/12/2022 2:17:34 PM
    known_error : False
    department_id :
    category :
    sub_category :
    item_category :
    created_at : 8/29/2022 2:17:34 PM
    updated_at : 8/29/2022 2:17:34 PM
 
    Get all Freshservice Problems.
 
.EXAMPLE
    Get-FreshServiceProblem -id 2
 
    id : 2
    agent_id :
    description : <div>A new problem</div>
    description_text : A new problem
    assets : {}
    requester_id : 21000418005
    subject : A new problem
    group_id :
    priority : 1
    impact : 1
    status : 1
    due_by : 1/14/2023 6:55:51 PM
    known_error : False
    department_id :
    category :
    sub_category :
    item_category :
    created_at : 1/9/2023 6:55:57 PM
    updated_at : 1/9/2023 6:55:57 PM
    associated_change :
    custom_fields :
    analysis_fields :
 
    Get a specific Freshservice Problem.
 
.EXAMPLE
    Get-FreshServiceProblem -Fields
 
    id : 21000472464
    created_at : 8/29/2022 2:17:34 PM
    updated_at : 8/29/2022 2:17:34 PM
    name : requester
    label : Requester
    description : Problem requester
    field_type : default_requester
    required : True
    required_for_closure : False
    position : 1
    default_field : True
    choices : {}
    nested_fields : {}
 
    id : 21000472465
    created_at : 8/29/2022 2:17:34 PM
    updated_at : 8/29/2022 2:17:34 PM
    name : subject
    label : Title
    description : Problem title
    field_type : default_subject
    required : True
    required_for_closure : False
    position : 2
    default_field : True
    choices : {}
    nested_fields : {}
 
    id : 21000472466
    created_at : 8/29/2022 2:17:34 PM
    updated_at : 8/29/2022 2:17:34 PM
    name : description
    label : Description
    description : Problem description
    field_type : default_description
    required : True
    required_for_closure : False
    position : 3
    default_field : True
    choices : {}
    nested_fields : {}
 
    id : 21000472467
    created_at : 8/29/2022 2:17:34 PM
    updated_at : 8/29/2022 2:17:34 PM
    name : status
    label : Status
    description : Problem status
    field_type : default_status
    required : True
    required_for_closure : False
    position : 4
    default_field : True
    choices : {@{id=1; value=Open}, @{id=2; value=Change Requested}, @{id=3; value=Closed}}
    nested_fields : {}
 
    Return all the built-in and custom fields for Problem.
.NOTES
    This module was developed and tested with Freshservice REST API v2.
#>

function Get-FreshServiceProblem {
    [CmdletBinding(DefaultParameterSetName = 'default')]
    param (
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Unique id of the the Problem on the Ticket',
            ParameterSetName = 'id',
            Position = 0
        )]
        [string]$id,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Workspace ID of the Problem. The attribute is applicable only for accounts with the Workspaces feature enabled. The default value is the ID of the primary workspace of the account.',
            ValueFromPipelineByPropertyName = $true
        )]
        [int]$workspace_id,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Allows you to view all the built-in and custom fields for Problem in your Freshservice account.',
            ParameterSetName = 'Form',
            Position = 0
        )]
        [Alias('Form')]
        [switch]$fields,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Number of records per page returned during pagination. Default is 30. Max is 100.',
            ParameterSetName = 'default',
            Position = 0
        )]
        [int]$per_page = 100,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Page number to begin record return.',
            ParameterSetName = 'default',
            Position = 1
        )]
        [int]$page = 1
    )
    begin {

        $PrivateData  = $MyInvocation.MyCommand.Module.PrivateData

        if (!$PrivateData.FreshserviceBaseUri) {
            throw "No connection found! Setup a new Freshservice connection with New-FreshServiceConnection and then Connect-FreshService. Set a default connection with New-FreshServiceConnection or Set-FreshConnection to automatically connect when importing the module."
        }

        $qry = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)

        if ($fields){
            $uri = [System.UriBuilder]('{0}/problem_form_fields' -f $PrivateData['FreshserviceBaseUri'])
        }
        else {
            $uri = [System.UriBuilder]('{0}/problems' -f $PrivateData['FreshserviceBaseUri'])
        }

        $enablePagination = $true

        if ($Id) {
            $uri.Path = "{0}/{1}" -f $uri.Path, $Id
            $enablePagination = $false
        }

    }
    process {

        try {

            if ($enablePagination) {
                $qry['page'] = $page
                $qry['per_page'] = $per_page
            }

            $uri.Query = $qry.ToString()

            $uri = $uri.Uri.AbsoluteUri

            $results = do {

                $params = @{
                    Uri         = $uri
                    Method      = 'GET'
                    ErrorAction = 'Stop'
                }

                $result = Invoke-FreshworksRestMethod @params

                if ($result.Content) {
                    $content = $result.Content |
                                    ConvertFrom-Json

                    #API returns singluar or plural property based on the number of records, parse to get property returned.
                    $objProperty = $content[0].PSObject.Properties.Name
                    Write-Verbose -Message ("Returning {0} property with count {1}" -f $objProperty, $content."$($objProperty)".Count)
                    $content."$($objProperty)"
                }

                if ($result.Headers.Link) {
                    $uri = [regex]::Matches($result.Headers.Link,'<(?<Uri>.*)>')[0].Groups['Uri'].Value
                }

            }
            until (!$result.Headers.Link)

        }
        catch {
            Throw $_
        }

    }
    end {

        $results

    }
}