Private/Initialize-AtwsRamCache.ps1

<#
    .COPYRIGHT
    Copyright (c) ECIT Solutions AS. All rights reserved. Licensed under the MIT license.
    See https://github.com/ecitsolutions/Autotask/blob/master/LICENSE.md for license information.
#>

Function Initialize-AtwsRamCache {
    <#
            .SYNOPSIS
                This function reads the cachefile into memory.
            .DESCRIPTION
                This function determines the correct path to a cache file and imports it.
                Then it creates a shadow cache for the current Autotask tenant.
            .INPUTS
                Nothing.
            .OUTPUTS
                Nothing, but the cache property of the SOAP Client object is filled.
            .EXAMPLE
                Initialize-AtwsRamCache
                Loads the cache from disk
            .NOTES
                NAME: Initialize-AtwsRamCache
            .LINK
    #>

    [CmdLetBinding()]
  
    Param()

    begin {
        Write-Verbose -Message ('{0}: trying to determine correct location for dynamic module cache.' -F $MyInvocation.MyCommand.Name)    
    
        # Get the current module name
        $myModule = (Get-Command -Name $MyInvocation.MyCommand.Name).Module
    
        $cacheFile = 'AutotaskFieldInfoCache.xml'
    
        # Use join-path to be platform agnostic on slashes in paths
        $centralCache = Join-Path $(Join-Path $myModule.ModuleBase 'Private') $cacheFile

        Write-Verbose -Message ('{0}: Module cache location is {1}' -F $MyInvocation.MyCommand.Name, $centralCache)  
        
    }
  
    process {
        # Keeping old cache code. Will use it to clean up from earlier module versions

        Write-Verbose -Message ('{0}: Initializing memory-only cache with data supplied with module ({1}).' -F $MyInvocation.MyCommand.Name, $centralCache)
        
        # Initialize memory only cache from module directory
        $Script:WebServiceCache = Import-Clixml -Path $centralCache 

        # Nested testing to make sure the structure is OK
        if ($Script:WebServiceCache -is [PSCustomObject]) {
            if ([bool]($Script:WebServiceCache.PSobject.Properties.name -match "FieldInfoCache")) {
                if (-not ($Script:WebServiceCache.FieldInfoCache.Count -gt 0)) {
                    Write-Warning ('{0}: RAM cache file is broken! Loading data from API!' -F $MyInvocation.MyCommand.Name)
                    # Restart import
                    Update-AtwsRamCache
                    # Do not process rest of script
                    return
                }
            }
        }

        # Initialize the $Script:FieldInfoCache shorthand
        $Script:FieldInfoCache = $Script:WebServiceCache.FieldInfoCache    

        # We must be connected to know the customer identity number
        if ($Script:Atws.CI) {
            # If the API version has been changed at the Autotask end we unfortunately have to reload all
            # entities from scratch
            $currentApiVersion = $Script:Atws.GetWsdlVersion($Script:Atws.IntegrationsValue)
            if ($Script:WebServiceCache.ApiVersion -ne $currentApiVersion -or [Version]$My.ModuleVersion -ne $Script:WebServiceCache.ModuleVersion) {
        
                # Call the import-everything function
                Update-AtwsRamCache
        
            }
        }
    }
  
    end {
        Write-Verbose ('{0}: End of function' -F $MyInvocation.MyCommand.Name)    
    }
}