modules/Devolutions.CIEM.Graph/Public/Get-CIEMGraphNode.ps1

function Get-CIEMGraphNode {
    [CmdletBinding()]
    [OutputType('CIEMGraphNode[]')]
    param(
        [Parameter()]
        [string]$Id,

        [Parameter()]
        [string]$Kind,

        [Parameter()]
        [string]$DisplayName,

        [Parameter()]
        [string]$Provider,

        [Parameter()]
        [string]$SubscriptionId
    )

    $ErrorActionPreference = 'Stop'

    $query = "SELECT id, kind, display_name, provider, subscription_id, resource_group, properties, collected_at FROM graph_nodes"
    $conditions = @()
    $parameters = @{}

    $columnMap = @{
        Id             = 'id'
        Kind           = 'kind'
        DisplayName    = 'display_name'
        Provider       = 'provider'
        SubscriptionId = 'subscription_id'
    }

    foreach ($paramName in $columnMap.Keys) {
        if ($PSBoundParameters.ContainsKey($paramName)) {
            $col = $columnMap[$paramName]
            $conditions += "$col = @$col"
            $parameters[$col] = $PSBoundParameters[$paramName]
        }
    }

    if ($conditions.Count -gt 0) {
        $query += "`nWHERE " + ($conditions -join ' AND ')
    }

    $rows = @(Invoke-CIEMQuery -Query $query -Parameters $parameters)

    @(foreach ($row in $rows) {
        $obj = [CIEMGraphNode]::new()
        $obj.Id = $row.id
        $obj.Kind = $row.kind
        $obj.DisplayName = $row.display_name
        $obj.Provider = $row.provider
        $obj.SubscriptionId = $row.subscription_id
        $obj.ResourceGroup = $row.resource_group
        $obj.Properties = $row.properties
        $obj.CollectedAt = $row.collected_at
        $obj
    })
}