modules/Devolutions.CIEM.Checks/Public/Save-CIEMCheck.ps1

function Save-CIEMCheck {
    [CmdletBinding(DefaultParameterSetName = 'ByProperties')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Upsert operation for bulk data')]
    param(
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][string]$Id,
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][string]$Provider,
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][string]$Service,
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][string]$Title,
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][ValidateSet('critical','high','medium','low')][string]$Severity,
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')][string]$CheckScript,
        [Parameter(ParameterSetName = 'ByProperties')][string]$Description,
        [Parameter(ParameterSetName = 'ByProperties')][string]$Risk,
        [Parameter(ParameterSetName = 'ByProperties')][string]$RemediationText,
        [Parameter(ParameterSetName = 'ByProperties')][string]$RemediationUrl,
        [Parameter(ParameterSetName = 'ByProperties')][string]$RelatedUrl,
        [Parameter(ParameterSetName = 'ByProperties')][bool]$Disabled = $false,
        [Parameter(ParameterSetName = 'ByProperties')][string]$Permissions,
        [Parameter(ParameterSetName = 'ByProperties')][string[]]$DependsOn,
        [Parameter(ParameterSetName = 'ByProperties')][string[]]$DataNeeds,
        [Parameter(Mandatory, ParameterSetName = 'InputObject', ValueFromPipeline)]
        [PSObject[]]$InputObject
    )
    process {
        if ($PSCmdlet.ParameterSetName -eq 'InputObject') {
            foreach ($item in $InputObject) {
                if ($item.PSObject.Properties.Name -contains 'DataNeeds' -and $null -ne $item.DataNeeds -and @($item.DataNeeds).Count -eq 0) {
                    throw "Check '$($item.Id)' must declare at least one data need."
                }
                $cId = $item.Id; $cProvider = $item.Provider; $cService = $item.Service; $cTitle = $item.Title
                $cSeverity = [string]$item.Severity; $cCheckScript = $item.CheckScript; $cDescription = $item.Description
                $cRisk = $item.Risk; $cRemediationText = $item.Remediation.Text; $cRemediationUrl = $item.Remediation.Url
                $cRelatedUrl = $item.RelatedUrl; $cDisabled = $item.Disabled
                $cPermissions = if ($item.Permissions) { $item.Permissions | ConvertTo-Json -Compress } else { $null }
                $cDependsOn = if ($item.DependsOn) { ConvertTo-Json -InputObject @($item.DependsOn) -Compress } else { $null }
                $cDataNeeds = if ($item.PSObject.Properties.Name -contains 'DataNeeds' -and $null -ne $item.DataNeeds) { ConvertTo-Json -InputObject @($item.DataNeeds) -Compress } else { $null }
                Invoke-CIEMQuery -Query "INSERT OR REPLACE INTO checks (id, provider, service, title, description, risk, severity, remediation_text, remediation_url, related_url, check_script, disabled, permissions, depends_on, data_needs) VALUES (@id, @provider, @service, @title, @description, @risk, @severity, @remediation_text, @remediation_url, @related_url, @check_script, @disabled, @permissions, @depends_on, @data_needs)" -Parameters @{
                    id = $cId; provider = $cProvider; service = $cService; title = $cTitle
                    description = $cDescription; risk = $cRisk; severity = $cSeverity
                    remediation_text = $cRemediationText; remediation_url = $cRemediationUrl
                    related_url = $cRelatedUrl; check_script = $cCheckScript
                    disabled = if ($cDisabled) { 1 } else { 0 }; permissions = $cPermissions; depends_on = $cDependsOn; data_needs = $cDataNeeds
                } -AsNonQuery | Out-Null
            }
        } else {
            if ($PSBoundParameters.ContainsKey('DataNeeds') -and @($DataNeeds).Count -eq 0) {
                throw "Check '$Id' must declare at least one data need."
            }

            Invoke-CIEMQuery -Query "INSERT OR REPLACE INTO checks (id, provider, service, title, description, risk, severity, remediation_text, remediation_url, related_url, check_script, disabled, permissions, depends_on, data_needs) VALUES (@id, @provider, @service, @title, @description, @risk, @severity, @remediation_text, @remediation_url, @related_url, @check_script, @disabled, @permissions, @depends_on, @data_needs)" -Parameters @{
                id = $Id; provider = $Provider; service = $Service; title = $Title
                description = $Description; risk = $Risk; severity = $Severity
                remediation_text = $RemediationText; remediation_url = $RemediationUrl
                related_url = $RelatedUrl; check_script = $CheckScript
                disabled = if ($Disabled) { 1 } else { 0 }; permissions = $Permissions
                depends_on = if ($PSBoundParameters.ContainsKey('DependsOn')) { ConvertTo-Json -InputObject @($DependsOn) -Compress } else { $null }
                data_needs = if ($PSBoundParameters.ContainsKey('DataNeeds')) { ConvertTo-Json -InputObject @($DataNeeds) -Compress } else { $null }
            } -AsNonQuery | Out-Null
        }
    }
}