Public/Get-FreshServiceAsset.ps1

<#
.SYNOPSIS
    Returns a Freshservice Asset.
 
.DESCRIPTION
    Returns a Freshservice Asset via REST API.
 
    https://api.freshservice.com/#view_an_asset
 
.PARAMETER display_id
    The display Id of the asset.
 
.PARAMETER filter
    Custom filters supported by the api can be found here: https://api.freshservice.com/#filter_assets. The filter is automatically url encoded at runtime.
 
.PARAMETER name
    Quick filter Assets by Name. Tokenized search appears to be supported.
 
.PARAMETER asset_tag
    Quick filter Assets by Asset Tag. Tokenized search appears to be supported.
 
.PARAMETER serial_number
    Quick filter Assets by Serial Number
 
.PARAMETER SearchTrash
    Will return all the assets that are in trash. Does not return active asset in addition to trash, assets in trash only.
 
.PARAMETER IncludeTypeFields
    Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.
 
    IMPORTANT: Each include will consume an additional two (2) credits. For example, if you embed the 'type_fields' information you will be charged a total of 3 API credits for each call.
 
.PARAMETER components
    This operation allows you to view information about all the components of an asset in the account.
 
.PARAMETER requests
    This operation allows you to view a list of all the requests associated to the asset in the account.
 
.PARAMETER contracts
    This operation allows you to get a list of all the contracts that an asset has been associated to.
 
.PARAMETER relationships
    This operation allows you to create new relationships in bulk.
 
.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-FreshServiceAsset
 
    id : 21000460190
    display_id : 4
    name : Asset1234
    description : ABC1234
    asset_type_id : 21000855272
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-4
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 9/30/2022 5:12:04 PM
    updated_at : 9/30/2022 5:12:04 PM
    end_of_life :
 
    id : 21000207685
    display_id : 3
    name : Logitech Mouse
    description :
    asset_type_id : 21000855268
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-3
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 8/29/2022 2:17:48 PM
    updated_at : 8/29/2022 2:17:48 PM
    end_of_life :
 
    id : 21000207684
    display_id : 2
    name : Dell Monitor
    description :
    asset_type_id : 21000855276
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-2
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 8/29/2022 2:17:48 PM
    updated_at : 8/29/2022 2:17:48 PM
    end_of_life :
 
    id : 21000207683
    display_id : 1
    name : Andrea's Laptop
    description :
    asset_type_id : 21000855304
    impact : medium
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-1
    user_id : 21000418006
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 8/29/2022 2:17:48 PM
    updated_at : 8/29/2022 2:17:48 PM
    end_of_life :
 
    Returns all FreshService Assets.
.EXAMPLE
    Get-FreshServiceAsset -Id 4
 
    id : 21000460190
    display_id : 4
    name : Asset1234
    description : ABC1234
    asset_type_id : 21000855272
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-4
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 9/30/2022 5:12:04 PM
    updated_at : 9/30/2022 5:12:04 PM
    attachments : {}
    cloud_files : {}
    end_of_life :
 
    Returns a Freshservice Asset by Display Id.
 
.EXAMPLE
    Get-FreshServiceAsset -display_id 4 -IncludeTypeFields
 
    id : 21000460190
    display_id : 4
    name : Asset1234
    description : ABC1234
    asset_type_id : 21000855272
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-4
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 9/30/2022 5:12:04 PM
    updated_at : 9/30/2022 5:12:04 PM
    attachments : {}
    cloud_files : {}
    end_of_life :
    type_fields : @{product_21000855267=21000056898; vendor_21000855267=; cost_21000855267=; warranty_21000855267=;
                    acquisition_date_21000855267=; warranty_expiry_date_21000855267=; domain_21000855267=;
                    asset_state_21000855267=In Use; serial_number_21000855267=ABC1234; last_audit_date_21000855267=;
                    os_21000855272=; os_version_21000855272=; os_service_pack_21000855272=; memory_21000855272=;
                    disk_space_21000855272=; cpu_speed_21000855272=; cpu_core_count_21000855272=; mac_address_21000855272=;
                    uuid_21000855272=; hostname_21000855272=Asset1234; computer_ip_address_21000855272=;
                    last_login_by_21000855272=; depreciation_id=; salvage=}
 
    Returns a Freshservice Asset by Id and Include Type Fields.
 
.EXAMPLE
    Get-FreshServiceAsset -Filter "asset_state:'In Stock' and asset_type_id:21000855276"
 
    id : 21000207684
    display_id : 2
    name : Dell Monitor
    description :
    asset_type_id : 21000855276
    impact : low
    author_type : User
    usage_type : permanent
    asset_tag : ASSET-2
    user_id :
    department_id :
    location_id :
    agent_id :
    group_id :
    assigned_on :
    created_at : 8/29/2022 2:17:48 PM
    updated_at : 8/29/2022 2:17:48 PM
    end_of_life :
 
    Get Freshservice Asset(s) using filter criteria that the asset state is 'In Stock' and has a Asset Type Id of '21000855276'. See https://api.freshservice.com/#filter_assets
    for examples and available filter parameters. The passed filter is automatically url encoded at runtime.
 
.NOTES
    This module was developed and tested with Freshservice REST API v2.
#>

    function Get-FreshServiceAsset {
    [CmdletBinding(DefaultParameterSetName = 'default')]

    param (
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Display id of Agent Role.',
            ParameterSetName = 'id',
            Position = 0
        )]
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Display id of Agent Role.',
            ParameterSetName = 'components',
            Position = 0
        )]
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Display id of Agent Role.',
            ParameterSetName = 'requests',
            Position = 0
        )]
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Display id of Agent Role.',
            ParameterSetName = 'contracts',
            Position = 0
        )]
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Display id of Agent Role.',
            ParameterSetName = 'relationships',
            Position = 0
        )]
        [Alias('DisplayId','id')]
        [long]$display_id,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Filter for Assets',
            ParameterSetName = 'Filter',
            Position = 0
        )]
        [string]$filter,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Name of the Asset',
            ParameterSetName = 'ByName',
            Position = 0
        )]
        [string]$name,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Asset Tag of the Asset',
            ParameterSetName = 'ByAssetTag',
            Position = 0
        )]
        [string]$asset_tag,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Serial Number of the Asset',
            ParameterSetName = 'BySerialNumber',
            Position = 0
        )]
        [string]$serial_number,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Return Freshservice Assets (only) in Trash',
            ParameterSetName = 'Trash',
            Position = 0
        )]
        [Alias('deleted', 'trash')]
        [switch]$SearchTrash,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'default',
            Position = 1
        )]
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'id',
            Position = 1
        )]
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'ByName',
            Position = 1
        )]
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'BySerialNumber',
            Position = 1
        )]
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'Filter',
            Position = 1
        )]
       [Parameter(
            Mandatory = $false,
            HelpMessage = 'Will return all fields that are specific to each asset type. For example, for Hardware Asset Type, including type_fields will return fields such as Product_ID, Vendor_ID and Serial_number.',
            ParameterSetName = 'ByAssetTag',
            Position = 1
        )]
        [switch]$IncludeTypeFields,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'This operation allows you to view information about all the components of an asset in the account.',
            ParameterSetName = 'components',
            Position = 1
        )]
        [switch]$components,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'This operation allows you to view a list of all the requests associated to the asset in the account.',
            ParameterSetName = 'requests',
            Position = 1
        )]
        [switch]$requests,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'This operation allows you to get a list of all the contracts that an asset has been associated to.',
            ParameterSetName = 'contracts',
            Position = 1
        )]
        [switch]$contracts,
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Lists all the relationships of a particular asset.',
            ParameterSetName = 'relationships',
            Position = 1
        )]
        [switch]$relationships,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Number of records per page returned during pagination. Default is 30. Max is 100.',
            ParameterSetName = 'default',
            Position = 2
        )]
        [int]$per_page = 100,
        [Parameter(
            Mandatory = $false,
            HelpMessage = 'Page number to begin record return.',
            ParameterSetName = 'default',
            Position = 3
        )]
        [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)
        $uri = [System.UriBuilder]('{0}/assets' -f $PrivateData['FreshserviceBaseUri'])
        $enablePagination = $true

        if ($display_id) {
            $uri.Path = "{0}/{1}" -f $uri.Path, $display_id
            $enablePagination = $false
        }
        elseif ($filter) {
            $qry.Add('filter', '"{0}"' -f $filter )
            $enablePagination = $false
        }

        if ($PSBoundParameters.ContainsKey('name')) {
            $qry.Add('search', '"name:''{0}''"' -f $name )
            $enablePagination = $false
        }

        if ($PSBoundParameters.ContainsKey('asset_tag')) {
            $qry.Add('search', '"asset_tag:''{0}''"' -f $asset_tag )
            $enablePagination = $false
        }

        if ($PSBoundParameters.ContainsKey('serial_number')) {
            $qry.Add('search', '"serial_number:''{0}''"' -f $serial_number )
            $enablePagination = $false
        }

        if ($PSBoundParameters.ContainsKey('IncludeTypeFields')) {
            $qry.Add('include', 'type_fields')
        }

        if ($PSBoundParameters.ContainsKey('SearchTrash')) {
            $qry.Add('trashed', 'true' )
        }

        if ($PSBoundParameters.ContainsKey('components')) {
            $uri.Path = "{0}/components" -f $uri.Path
            $enablePagination = $true
        }

        if ($PSBoundParameters.ContainsKey('requests')) {
            $uri.Path = "{0}/requests" -f $uri.Path
            $enablePagination = $true
        }

        if ($PSBoundParameters.ContainsKey('contracts')) {
            $uri.Path = "{0}/contracts" -f $uri.Path
            $enablePagination = $true
        }

        if ($PSBoundParameters.ContainsKey('relationships')) {
            $uri.Path = "{0}/relationships" -f $uri.Path
            $enablePagination = $true
        }

    }
    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

    }
}