modules/Azure/Discovery/Private/UpdateCIEMAzureEntity.ps1

function UpdateCIEMAzureEntity {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$Entity,

        [Parameter(Mandatory)]
        [hashtable]$Filters,

        [Parameter(Mandatory)]
        [hashtable]$Values,

        [Parameter()]
        [object]$Connection
    )

    $ErrorActionPreference = 'Stop'

    $config = GetCIEMAzureEntityConfig -Entity $Entity
    if ($Filters.Count -eq 0) {
        throw "UpdateCIEMAzureEntity: entity '$Entity' requires at least one filter."
    }
    if ($Values.Count -eq 0) {
        throw "UpdateCIEMAzureEntity: entity '$Entity' requires at least one value."
    }

    $propertyToColumn = @{}
    foreach ($column in $config.PropertyMap.Keys) {
        $propertyToColumn[$config.PropertyMap[$column]] = $column
    }

    $setClauses = [System.Collections.Generic.List[string]]::new()
    $whereClauses = [System.Collections.Generic.List[string]]::new()
    $parameters = @{}

    foreach ($valueName in ($Values.Keys | Sort-Object)) {
        if ($valueName -notin $config.WritableColumns) {
            throw "UpdateCIEMAzureEntity: unknown writable value '$valueName' for entity '$Entity'."
        }

        $column = $propertyToColumn[$valueName]
        if (-not $column) {
            throw "UpdateCIEMAzureEntity: value '$valueName' for entity '$Entity' has no column mapping."
        }

        $parameterName = "set_$column"
        $setClauses.Add("$column = @$parameterName")
        $parameters[$parameterName] = $Values[$valueName]
    }

    foreach ($filterName in ($Filters.Keys | Sort-Object)) {
        if (-not $config.FilterColumns.ContainsKey($filterName)) {
            throw "UpdateCIEMAzureEntity: unknown filter '$filterName' for entity '$Entity'."
        }

        $column = $config.FilterColumns[$filterName]
        $parameterName = "where_$column"
        $whereClauses.Add("$column = @$parameterName")
        $parameters[$parameterName] = $Filters[$filterName]
    }

    $query = "UPDATE $($config.Table) SET $($setClauses -join ', ') WHERE $($whereClauses -join ' AND ')"
    if ($Connection) {
        Invoke-PSUSQLiteQuery -Connection $Connection -Query $query -Parameters $parameters -AsNonQuery | Out-Null
    } else {
        Invoke-CIEMQuery -Query $query -Parameters $parameters -AsNonQuery | Out-Null
    }
}