Public/Source/Invoke-SourcePlugins.ps1

<#
.SYNOPSIS
Discover and run the configured source and override plugins, returning their data.
 
.DESCRIPTION
Iterates the Plugins array from the configuration in order. For each enabled descriptor it
verifies <PluginsRoot>\<Function>.ps1 exists, dot-sources it, and confirms the function resolves
— disabling the plugin with a Warn if the file fails to load or the function is missing. Each
plugin is invoked with no arguments. Source plugin output is passed through
Test-IDBridgeSourceData before being collected; when Debug.testRun is set, each source plugin's
validated output is then capped at the first 10 records for faster iteration. Override output is
collected as-is. Throws if no source data was gathered after all plugins run.
 
.OUTPUTS
[pscustomobject] @{ SourceData; OverrideData } — the combined results split by plugin Type.
 
.EXAMPLE
$plugins = Invoke-SourcePlugins
$sourceData = $plugins.SourceData
 
.NOTES
   Created by: Sam Cattanach
   Modified: 2026-06-26
#>

function Invoke-SourcePlugins {
    [CmdletBinding()]
    param()

    #region Import Configuration
    try { $IDConfig = Get-IDBridgeConfig } catch { Throw $_ }
    #endregion Import Configuration

    $sourceData = @()
    $overrideData = @()
    foreach ($plugin in $IDConfig.Plugins) {
        if ($plugin.Enabled -ne $true) {
            Write-Log -Message "Plugin: $($plugin.Function) is disabled in config. Skipping plugin." -Level Trace
            Continue
        }

        if (Test-Path "$($IDConfig.Paths.PluginsRoot)\$($plugin.Function).ps1" -PathType Leaf -ErrorAction SilentlyContinue) {
            try {
                . "$($IDConfig.Paths.PluginsRoot)\$($plugin.Function).ps1"
            }
            catch {
                Write-Log -Message "Plugin: $($plugin.Function) is enabled in config but failed to load. Disabling plugin. Error: $($_)" -Level Warn
                $plugin.Enabled = $false
                Continue
            }
        }

        if (-not (Get-Command $plugin.Function -ErrorAction SilentlyContinue)) {
            Write-Log -Message "Plugin: $($plugin.Function) is enabled in config but not found. Disabling plugin." -Level Warn
            $plugin.Enabled = $false
            Continue
        }

        #If the plugin is enabled and the function exists, run the plugin to gather data and add it to the list of data to be processed later in the script.
        try {
            Write-Log -Message "Running $($plugin.Type) Plugin: $($plugin.Function)" -Level Info
            $pluginData = $null
            
            $pluginData = & $plugin.Function
            #$pluginData = & (Get-Command "$($IDConfig.Paths.PluginsRoot)\$($plugin.Function).ps1").ScriptBlock
        }
        catch { Throw $_ }

        if ($pluginData) {
            if ($plugin.Type -eq "Source") {
                $validData = Test-IDBridgeSourceData -InputObject $pluginData -PluginName $plugin.Function

                #Limit each source plugin's data to 10 records if Test Run is active
                if ($IDConfig.Debug.testRun -eq $true -and $validData.Count -gt 0) {
                    $validData = @($validData | Select-Object -First 10)
                    Write-Log -Message "TEST RUN: LIMITING $($plugin.Function) SOURCE DATA TO $($validData.Count) USERS - $($validData.PersonID)"
                }

                $sourceData += $validData
            }
            if ($plugin.Type -eq "Override") {
                $overrideData += $pluginData
            }
        } else {
            if ($plugin.Type -eq "Source") {
                Write-Log -Message "Plugin: Source: $($plugin.Function) did not return any data." -Level Warn
            }
            if ($plugin.Type -eq "Override") {
                Write-Log -Message "Plugin: Override: $($plugin.Function) did not return any data." -Level Trace
            }
        }
    }

    if ($sourceData.Count -eq 0) {
        Throw "No source data gathered from plugins. Please check plugin configurations and logs for details."
    }

    return [PSCustomObject]@{
        SourceData   = $sourceData
        OverrideData = $overrideData
    }
}