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

function Save-CIEMGraphNode {
    [CmdletBinding(DefaultParameterSetName = 'ByProperties')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Upsert operation for bulk data')]
    [OutputType('CIEMGraphNode[]')]
    param(
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')]
        [string]$Id,

        [Parameter(Mandatory, ParameterSetName = 'ByProperties')]
        [string]$Kind,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$DisplayName,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$Provider,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$SubscriptionId,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$ResourceGroup,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$Properties,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$CollectedAt,

        [Parameter(Mandatory, ParameterSetName = 'InputObject', ValueFromPipeline)]
        [PSObject[]]$InputObject,

        [Parameter()]
        [Microsoft.Data.Sqlite.SqliteConnection]$Connection
    )

    process {
        $ErrorActionPreference = 'Stop'

        if ($PSCmdlet.ParameterSetName -eq 'InputObject') {
            foreach ($obj in $InputObject) {
                $collectedAt = if ($obj.CollectedAt) { $obj.CollectedAt } else { (Get-Date).ToString('o') }
                $provider = if ($obj.Provider) { $obj.Provider } else { 'azure' }
                $parameters = @{
                    id              = $obj.Id
                    kind            = $obj.Kind
                    display_name    = $obj.DisplayName
                    provider        = $provider
                    subscription_id = $obj.SubscriptionId
                    resource_group  = $obj.ResourceGroup
                    properties      = $obj.Properties
                    collected_at    = $collectedAt
                }

                $sql = @"
INSERT OR REPLACE INTO graph_nodes (id, kind, display_name, provider, subscription_id, resource_group, properties, collected_at)
VALUES (@id, @kind, @display_name, @provider, @subscription_id, @resource_group, @properties, @collected_at)
"@


                if ($Connection) {
                    Invoke-PSUSQLiteQuery -Connection $Connection -Query $sql -Parameters $parameters -AsNonQuery | Out-Null
                } else {
                    Invoke-CIEMQuery -Query $sql -Parameters $parameters -AsNonQuery | Out-Null
                }
            }
            return
        }

        if (-not $CollectedAt) {
            $CollectedAt = (Get-Date).ToString('o')
        }

        if (-not $Provider) {
            $Provider = 'azure'
        }

        $parameters = @{
            id              = $Id
            kind            = $Kind
            display_name    = $DisplayName
            provider        = $Provider
            subscription_id = $SubscriptionId
            resource_group  = $ResourceGroup
            properties      = $Properties
            collected_at    = $CollectedAt
        }

        $sql = @"
INSERT OR REPLACE INTO graph_nodes (id, kind, display_name, provider, subscription_id, resource_group, properties, collected_at)
VALUES (@id, @kind, @display_name, @provider, @subscription_id, @resource_group, @properties, @collected_at)
"@


        if ($Connection) {
            Invoke-PSUSQLiteQuery -Connection $Connection -Query $sql -Parameters $parameters -AsNonQuery | Out-Null
        } else {
            Invoke-CIEMQuery -Query $sql -Parameters $parameters -AsNonQuery | Out-Null
        }
    }
}