Public/Get-MetricDefinitions.ps1

<#
    .SYNOPSIS
    Retrieve the metadata from the salesforce org related to measurements, metrics, units, and device models.

    .DESCRIPTION
    This function returns a hastable with the following keys:
        measurements - the contents of the table "phecc__Measurement_Type__c"
        measurementMetrics - the contents of the table "phecc__Measurement_Type_Metric__c"
        metrics - the contents of the table "phecc__Metric__c"
        metricUnits - the contents of the table "phecc__Metric_Unit__c"
        units - the contents of the table "phecc__Unit__c"
        models - the contents of the table "phecc__Device_Model__c"
        capabilities - the contents of the table "phecc__Measurement_Type_Capability__c"

    The multiple queries can 10 seconds or more so the result is cached in a file as specified by the CacheFile parameter.

    .INPUTS
    None. You cannot pipe objects to Get-MetricDefinitions.

    .OUTPUTS
    An Hashtable with keys contains metadata related to measurements, metrics, units, and device models in the org

    .PARAMETER CacheFile
    An existing cache file to avoid the call if exists. Defaults to "./measurement-metric-cache.json"

    .EXAMPLE
    C:\PS> $def = Get-MetricDefinitions

    .LINK
    See Get-Patients

    .NOTES
    Assumes config is initialized for org access.
#>

function Get-MetricDefinitions {
    param($CacheFile = "./measurement-metric-cache.json")
    $metadata = $null
    if ($CacheFile -and (Test-Path $CacheFile -PathType Leaf)) {
        $metadata = Get-Content -Path $CacheFile | ConvertFrom-Json -AsHashtable
    } else {
        $metadata = @{
            measurements = (Invoke-SfQuery "SELECT Id,Name,phecc__Device_Type_Code__c,phecc__Device_Type__c FROM phecc__Measurement_Type__c")
            measurementMetrics = (Invoke-SfQuery "SELECT Id,phecc__Measurement_Type_Metric_Code__c,phecc__Measurement_Type__c,phecc__Metric__c FROM phecc__Measurement_Type_Metric__c")
            metrics = (Invoke-SfQuery "SELECT Id,Name,phecc__Metric_Type_Code__c FROM phecc__Metric__c")
            metricUnits = (Invoke-SfQuery "SELECT Id,phecc__Metric_Unit_Code__c,phecc__Metric__c,phecc__Unit__c FROM phecc__Metric_Unit__c")
            units = (Invoke-SfQuery "SELECT Id,Name,phecc__Unit_Type_Code__c FROM phecc__Unit__c")
            models = (Invoke-SfQuery "SELECT Id,Name FROM phecc__Device_Model__c")
            capabilities = (Invoke-SfQuery "SELECT Id,phecc__Device_Model__c,phecc__Measurement_Type__c FROM phecc__Measurement_Type_Capability__c")
        }
        $metadata | ConvertTo-Json -Depth 100 | Set-Content -Path $CacheFile | Out-Null
    }
    $metadata
}