Public/functions/New-DssConfig.ps1

function New-DssConfig {
    <#
    .SYNOPSIS
        Creates a New configuration for a security scan

    .PARAMETER SqlInstance
        SQL Server instance holding the databse to be used as the base for the configuration

    .PARAMETER SqlCredential
        A PSCredential object to connect to SqlInstance

    .PARAMETER Database
        Database to use as basis for config

    .PARAMETER UserConfig
        Switch to indicate you want a user based config

    .PARAMETER SchemaConfig
        Switch to indicate you want a Schema based config

    .PARAMETER ObjectConfig
        Switch to indicate you an Object based config

    .PARAMETER ConfigPath
        Where to save the generated config, if not specified it will go to STDOUT

    .PARAMETER IncludeSystemObjects
        By default the object config does not include system objects. This switch overrides that and returns all objects

    .EXAMPLE
        New-DssConfig -SqlInstance local\instance1 -Database db1

        Generates all the config json for db1 on local\instance1

    .EXAMPLE
        New-DssConfig -SqlInstance local\instance1 -Database db1 -UserConfig

        Generates the User config json for db1 on local\instance1

    .EXAMPLE
        New-DssConfig -SqlInstance local\instance1 -Database db1 -UserConfig -SchemaConfig

        Generates the User and Schema config json for db1 on local\instance1
    #>

    [CmdletBinding(DefaultParameterSetName = "Default")]
    param (
        [string]$SqlInstance,
        [PSCredential]$SqlCredential,
        [string]$ConfigPath,
        [string]$Database,
        [switch]$UserConfig,
        [switch]$RoleConfig,
        [switch]$SchemaConfig,
        [switch]$ObjectConfig,
        [switch]$IncludeSystemObjects
    )
    begin {}
    process {}
    end {
        $configSwitch = $true
        if ($UserConfig -or $SchemaConfig -or $RoleConfig -or $ObjectConfig){
            $configSwitch = $false
        }
        if ($UserConfig -or $configSwitch) {
            Write-Verbose -Message "Fetching User config"
            $configUser = New-DssUserConfig -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database
        } 
        if ($RoleConfig -or $configSwitch) {
            Write-Verbose -Message "Fetching Role config"
            $configRole = New-DssRoleConfig -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database
        } 
        if ($SchemaConfig -or $configSwitch) {
            Write-Verbose -Message "Fetching Schema config"
            $configSchema = New-DssSchemaConfig -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -IncludeSystemObjects:$IncludeSystemObjects
        } 
        if ($ObjectConfig -or $configSwitch) {
            Write-Verbose -Message "Fetching Object config"
            $configObject = New-DssObjectConfig -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -IncludeSystemObjects:$IncludeSystemObjects
        }
        $internalConfig = [PsCustomObject]@{
                    SystemObjects   = if($IncludeSystemObjects -eq $true ){$True} else {$False}
                    Generated       = Get-Date
                    Database        = $Database
                    SqlInstance     = $SqlInstance
                }   

        $output = [PsCustomObject]@{
                    config = $internalConfig
                    roles = $configRole
                    users = $configUser
                    schemas = $configSchema
                    objects = $configObject
        } 

        if ($ConfigPath -ne ''){
            $output | ConvertTo-Json -Depth 7 | Out-File $ConfigPath
        } else {
            $output
        }
    }
}