Public/New-DpaMonitor.ps1

function Add-DpaMonitor {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        $ServerName,

        [Parameter()]
        $Port,

        [Parameter(Mandatory)]
        [ValidateSet('AzureSQLDB', 'Db2', 'MySQL', 'Oracle', 'SQLServer', 'Sybase')]
        $DatabaseType,

        [Parameter()]
        $DisplayName,

        [Parameter()]
        [switch] $AmazonRDS,

        [Parameter()]
        [string] $RepositoryTableSpace,

        [Parameter()]
        [string] $JdbcUrlProperties,

        [Parameter()]
        [string] $ConnectionProperties,

        [Parameter(Mandatory)]
        [PSCredential] $Credential,

        [Parameter()]
        [PSCredential] $MonitoringCredential,

        [switch] $EnableException
    )

    $oracleOnlyParameters = @(
        'ServiceNameOrSID',
        'MonitoringUserTableSpace',
        'MonitoringUserTempTableSpace',
        'SysPassword',
        'SysBypass',
        'OracleEBusinessEnabled'
    )
    foreach ($oracleOnlyParameter in $oracleOnlyParameters) {
        if ($DatabaseType -ne 'Oracle' -and $PSBoundParameters.ContainsKey($oracleOnlyParameter)) {
            Write-PSFMessage -Level Warning -Message "The $oracleOnlyParameter parameter is not available for $DatabaseType. It will be ignored."
        }
    }

    if ($DatabaseType -notin @('AzureSQLDB', 'Db2') -and $PSBoundParameters.ContainsKey('Database')) {
        Write-PSFMessage -Level Warning -Message "The Database parameter is not available for $DatabaseType. It will be ignored."
    }

    if ($DatabaseType -eq 'Db2' -and $PSBoundParameters.ContainsKey('MonitoringCredential')) {
        Write-PSFMessage -Level Warning -Message "The MontioringCredential parameter is not available for Db2. It will be ignored."
    }

    $request = @{
        serverName = $ServerName
        databaseType = $DatabaseType.ToUpper()
    }

    if ($PSBoundParameters.ContainsKey('Port')) {
        $request['port'] = $Port
    }

    if ($AmazonRDS.IsPresent) {
        $request['amazonRds'] = $AmazonRDS
    }

    if ($PSBoundParameters.ContainsKey('RepositoryTableSpace')) {
        $request['repositoryTableSpace'] = $RepositoryTableSpace
    }

    if ($PSBoundParameters.ContainsKey('JdbcUrlProperties')) {
        $request['jdbcUrlProperties'] = $JdbcUrlProperties
    }

    if ($PSBoundParameters.ContainsKey('ConnectionProperties')) {
        $request['connectionProperties'] = $ConnectionProperties
    }

    if ($DatabaseType -eq 'SQLServer') {
        $isDomainUser = $Credential.GetNetworkCredential().Domain -ne ''
        if ($isDomainUser) {
            $request['sysadminIsWindowsAuth'] = $true
            $request['monitoringUserIsNew'] = $false
        }
    }

    $request['sysAdminUser'] = $Credential.UserName
    $request['sysAdminPassword'] = $Credential.GetNetworkCredential().Password

    if ($DatabaseType -ne 'Db2') {
        if ($PSBoundParameters.ContainsKey('MonitoringCredential') -and $DatabaseType -ne 'Db2') {
            $request['monitoringUser'] = $MonitoringCredential.UserName
            $request['monitoringUserPassword'] = $MonitoringCredential.GetNetworkCredential().Password
        }
        else {
            $request['monitoringUser'] = $Credential.UserName
            $request['monitoringUserPassword'] = $Credential.GetNetworkCredential().Password
        }
    }

    try {
        $response = Invoke-DpaRequest -Endpoint '/databases/register-monitor' -Request $request -Method 'POST'
    }
    catch {
        Stop-PSFFunction -Message "Could not register monitor" -ErrorRecord $_
        return
    }

    if ($response.Result -eq 'SUCCESS') {
        Get-DpaMonitor -DatabaseId $response.DatabaseId
    }
}