Public/Logging/Set-R1LogSetting.ps1

# .ExternalHelp psRadiantOne-help.xml
function Set-R1LogSetting {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium', DefaultParameterSetName = 'Component')]
    [OutputType([void])]
    param(
        [parameter(
            Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'Component'
        )]
        [ValidateSet(
            'RadiantOne Server',
            'Persistent Cache Periodic Refresh',
            'ADAP Access',
            'Sync Engine',
            'SCIM',
            'Scheduler Server',
            'Scheduler Tasks',
            'Control Panel Server',
            'Control Panel Access',
            'Control Panel Context Builder Audit',
            'Common User',
            'Sync Agents',
            'RadiantOne LDAP Access'
        )]
        [string]$component,

        [parameter(
            Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'DataSource'
        )]
        [ValidateNotNullOrEmpty()]
        [string]$dsName,

        [parameter(
            Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            ParameterSetName = 'Plugin'
        )]
        [ValidateNotNullOrEmpty()]
        [string]$pluginName,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateSet('OFF', 'FATAL', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE')]
        [string]$logLevel,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$rolloverSize,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateRange(1, [int64]::MaxValue)]
        [int64]$archiveMaxFileCount,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [bool]$integrityAssurance,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [hashtable[]]$advancedProperties,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [bool]$enableDebugSSL,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [bool]$logNotificationFailure,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$accessLogTextFormat,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$accessLogCsvFormat,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [bool]$addColumnNamesHeadersToCsv,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$ignoreAccessLogsNamingContext,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$textDestination,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$textRolloverDestination,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$textDeleteGlob,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$scanFolder,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$csvDestination,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$csvRolloverDestination,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$csvDeleteGlob,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [int]$bufferSizeForFileLogging,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [bool]$useIsoFormat,

        [parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$timezone
    )

    Begin {

        Assert-R1Session -RequireToken

    }#begin

    Process {

        $Path = switch ($PSCmdlet.ParameterSetName) {

            'DataSource' { "log_settings/datasources/$($dsName | Get-EscapedString)" }
            'Plugin' { "log_settings/plugins/$($pluginName | Get-EscapedString)" }
            default { "log_settings/$($component | Get-EscapedString)" }

        }

        $URI = Resolve-R1ServiceUrl -Service Settings -Path $Path

        #Log settings are polymorphic: each component carries a different set of properties, keyed by
        #logSettingsComponent. Rather than model all seven variants, retrieve whichever one this
        #component uses and apply the supplied values over it, so the properties belonging to that
        #variant are preserved and no property foreign to it is introduced.
        $Identity = switch ($PSCmdlet.ParameterSetName) {
            'DataSource' { @{ dsName = $dsName } }
            'Plugin' { @{ pluginName = $pluginName } }
            default { @{ component = $component } }
        }

        $Target = $Identity.Values | Select-Object -First 1

        $Existing = Get-R1LogSetting @Identity -ErrorAction Stop | Select-Object -First 1

        if ($null -eq $Existing) {

            throw "No log settings found for '$Target'"

        }

        $Request = [ordered]@{ }

        foreach ($Property in $Existing.psobject.Properties) {

            $Request[$Property.Name] = $Property.Value

        }

        $Supplied = $PSBoundParameters | Get-Parameter -ParametersToRemove component, dsName, pluginName

        foreach ($Key in $Supplied.Keys) {

            $Request[$Key] = $Supplied[$Key]

        }

        if ($Request.Contains('advancedProperties')) {

            $Request['advancedProperties'] = @($Request['advancedProperties'])

        }

        $Body = $Request | ConvertTo-R1JsonBody -EmptyArrayProperty advancedProperties

        if ($PSCmdlet.ShouldProcess($Target, 'Update Log Settings')) {

            $null = Invoke-R1RestMethod -Uri $URI -Method PUT -Body $Body

        }

    }#process

    End { }#end

}