Private/Get-AtwsFieldInfo.ps1

<#
 
    .COPYRIGHT
    Copyright (c) Office Center Hønefoss AS. All rights reserved. Licensed under the MIT license.
    See https://github.com/officecenter/Autotask/blob/master/LICENSE.md for license information.
 
#>


Function Get-AtwsFieldInfo {
  <#
      .SYNOPSIS
      This function gets valid fields for an Autotask Entity
      .DESCRIPTION
      This function gets valid fields for an Autotask Entity
      .INPUTS
      None.
      .OUTPUTS
      [Autotask.Field[]]
      .EXAMPLE
      Get-AtwsFieldInfo -Entity Account
      Gets all valid built-in fields and user defined fields for the Account entity.
  #>

    
  [cmdletbinding(
    SupportsShouldProcess = $True,
    ConfirmImpact = 'Low'
  )]
  Param
  (
    [Parameter(
      Mandatory = $True,
      Position = 0
    )]
    [String]
    $Entity,

    [String]
    $Connection = 'Atws'
  )
    
  Begin { 
    Write-Verbose ('{0}: Begin of function' -F $MyInvocation.MyCommand.Name)
    
    # This will be replaced when this function is imported in the dynamic module
    $Prefix = '#Prefix'

    # This looks stupid in the static text file, but if the line above has been changed dynamically,
    # then this makes a lot of sense.
    If ($Prefix -ne '#Prefix') {
      $Connection = $Prefix
    }
    
    If (-not($global:AtwsConnection[$Connection].Url)) {
      Throw [ApplicationException] 'Not connected to Autotask WebAPI. Run Connect-AutotaskWebAPI first.'
    }
    Else {
      $Atws = $global:AtwsConnection[$Connection]
    }
    
    If (-not($script:FieldInfoCache)) {
      $script:FieldInfoCache = @{}
    }

    If (-not($script:FieldInfoCache.ContainsKey($Connection))) {
      $script:FieldInfoCache[$Connection] = @{}
    }
    
    $CacheExpiry = (Get-Date).AddMinutes(-15)
  }
  
  Process { 
    
    If (-not $script:FieldInfoCache[$Connection].ContainsKey($Entity) -or $script:FieldInfoCache[$Connection][$Entity].RetrievalTime -lt $CacheExpiry) { 
      $Caption = 'Set-Atws{0}' -F $Entity
      $VerboseDescrition = '{0}: About to get built-in fields and userdefined fields for {1}s' -F $Caption, $Entity
      $VerboseWarning = '{0}: About to get built-in fields and userdefined fields for {1}s. Do you want to continue?' -F $Caption, $Entity

      If ($PSCmdlet.ShouldProcess($VerboseDescrition, $VerboseWarning, $Caption)) { 
        $Result = $atws.GetFieldInfo($Entity)
      }
   
    
      If ($Result.Errors.Count -gt 0) {
        Foreach ($AtwsError in $Result.Errors) {
          Write-Error $AtwsError.Message
        }
        Return
      }
      
      # No errors
      Write-Verbose ('{0}: Save or update cache for entity {1}' -F $MyInvocation.MyCommand.Name, $Entity)
      $script:FieldInfoCache[$Connection][$Entity] = New-Object -TypeName PSObject -Property @{
        RetrievalTime = Get-Date
        FieldInfo     = $Result  
      }
            
    }
  
    Else {
      Write-Verbose ('{0}: Returning fieldinfo for entity {1} from cache' -F $MyInvocation.MyCommand.Name, $Entity)      
      $Result = $script:FieldInfoCache[$Connection][$Entity].FieldInfo
    }
  }  
  End {
    Write-Verbose ('{0}: End of function' -F $MyInvocation.MyCommand.Name)

    Return $Result
  }
    
    
}