/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
 */

'use strict';

const models = require('./index');

/**
 * A server blob auditing policy.
 *
 * @extends models['ProxyResource']
 */
class ServerBlobAuditingPolicy extends models['ProxyResource'] {
  /**
   * Create a ServerBlobAuditingPolicy.
   * @property {string} state Specifies the state of the policy. If state is
   * Enabled, storageEndpoint or isAzureMonitorTargetEnabled are required.
   * Possible values include: 'Enabled', 'Disabled'
   * @property {string} [storageEndpoint] Specifies the blob storage endpoint
   * (e.g. https://MyAccount.blob.core.windows.net). If state is Enabled,
   * storageEndpoint is required.
   * @property {string} [storageAccountAccessKey] Specifies the identifier key
   * of the auditing storage account. If state is Enabled and storageEndpoint
   * is specified, storageAccountAccessKey is required.
   * @property {number} [retentionDays] Specifies the number of days to keep in
   * the audit logs in the storage account.
   * @property {array} [auditActionsAndGroups] Specifies the Actions-Groups and
   * Actions to audit.
   *
   * The recommended set of action groups to use is the following combination -
   * this will audit all the queries and stored procedures executed against the
   * database, as well as successful and failed logins:
   *
   * BATCH_COMPLETED_GROUP,
   * SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP,
   * FAILED_DATABASE_AUTHENTICATION_GROUP.
   *
   * This above combination is also the set that is configured by default when
   * enabling auditing from the Azure portal.
   *
   * The supported action groups to audit are (note: choose only specific
   * groups that cover your auditing needs. Using unnecessary groups could lead
   * to very large quantities of audit records):
   *
   * APPLICATION_ROLE_CHANGE_PASSWORD_GROUP
   * BACKUP_RESTORE_GROUP
   * DATABASE_LOGOUT_GROUP
   * DATABASE_OBJECT_CHANGE_GROUP
   * DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP
   * DATABASE_OBJECT_PERMISSION_CHANGE_GROUP
   * DATABASE_OPERATION_GROUP
   * DATABASE_PERMISSION_CHANGE_GROUP
   * DATABASE_PRINCIPAL_CHANGE_GROUP
   * DATABASE_PRINCIPAL_IMPERSONATION_GROUP
   * DATABASE_ROLE_MEMBER_CHANGE_GROUP
   * FAILED_DATABASE_AUTHENTICATION_GROUP
   * SCHEMA_OBJECT_ACCESS_GROUP
   * SCHEMA_OBJECT_CHANGE_GROUP
   * SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP
   * SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP
   * SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP
   * USER_CHANGE_PASSWORD_GROUP
   * BATCH_STARTED_GROUP
   * BATCH_COMPLETED_GROUP
   *
   * These are groups that cover all sql statements and stored procedures
   * executed against the database, and should not be used in combination with
   * other groups as this will result in duplicate audit logs.
   *
   * For more information, see [Database-Level Audit Action
   * Groups](https://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions#database-level-audit-action-groups).
   *
   * For Database auditing policy, specific Actions can also be specified (note
   * that Actions cannot be specified for Server auditing policy). The
   * supported actions to audit are:
   * SELECT
   * UPDATE
   * INSERT
   * DELETE
   * EXECUTE
   * RECEIVE
   * REFERENCES
   *
   * The general form for defining an action to be audited is:
   * {action} ON {object} BY {principal}
   *
   * Note that <object> in the above format can refer to an object like a
   * table, view, or stored procedure, or an entire database or schema. For the
   * latter cases, the forms DATABASE::{db_name} and SCHEMA::{schema_name} are
   * used, respectively.
   *
   * For example:
   * SELECT on dbo.myTable by public
   * SELECT on DATABASE::myDatabase by public
   * SELECT on SCHEMA::mySchema by public
   *
   * For more information, see [Database-Level Audit
   * Actions](https://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions#database-level-audit-actions)
   * @property {uuid} [storageAccountSubscriptionId] Specifies the blob storage
   * subscription Id.
   * @property {boolean} [isStorageSecondaryKeyInUse] Specifies whether
   * storageAccountAccessKey value is the storage's secondary key.
   * @property {boolean} [isAzureMonitorTargetEnabled] Specifies whether audit
   * events are sent to Azure Monitor.
   * In order to send the events to Azure Monitor, specify 'State' as 'Enabled'
   * and 'IsAzureMonitorTargetEnabled' as true.
   *
   * When using REST API to configure auditing, Diagnostic Settings with
   * 'SQLSecurityAuditEvents' diagnostic logs category on the database should
   * be also created.
   * Note that for server level audit you should use the 'master' database as
   * {databaseName}.
   *
   * Diagnostic Settings URI format:
   * PUT
   * https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview
   *
   * For more information, see [Diagnostic Settings REST
   * API](https://go.microsoft.com/fwlink/?linkid=2033207)
   * or [Diagnostic Settings
   * PowerShell](https://go.microsoft.com/fwlink/?linkid=2033043)
   */
  constructor() {
    super();
  }

  /**
   * Defines the metadata of ServerBlobAuditingPolicy
   *
   * @returns {object} metadata of ServerBlobAuditingPolicy
   *
   */
  mapper() {
    return {
      required: false,
      serializedName: 'ServerBlobAuditingPolicy',
      type: {
        name: 'Composite',
        className: 'ServerBlobAuditingPolicy',
        modelProperties: {
          id: {
            required: false,
            readOnly: true,
            serializedName: 'id',
            type: {
              name: 'String'
            }
          },
          name: {
            required: false,
            readOnly: true,
            serializedName: 'name',
            type: {
              name: 'String'
            }
          },
          type: {
            required: false,
            readOnly: true,
            serializedName: 'type',
            type: {
              name: 'String'
            }
          },
          state: {
            required: true,
            serializedName: 'properties.state',
            type: {
              name: 'Enum',
              allowedValues: [ 'Enabled', 'Disabled' ]
            }
          },
          storageEndpoint: {
            required: false,
            serializedName: 'properties.storageEndpoint',
            type: {
              name: 'String'
            }
          },
          storageAccountAccessKey: {
            required: false,
            serializedName: 'properties.storageAccountAccessKey',
            type: {
              name: 'String'
            }
          },
          retentionDays: {
            required: false,
            serializedName: 'properties.retentionDays',
            type: {
              name: 'Number'
            }
          },
          auditActionsAndGroups: {
            required: false,
            serializedName: 'properties.auditActionsAndGroups',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'StringElementType',
                  type: {
                    name: 'String'
                  }
              }
            }
          },
          storageAccountSubscriptionId: {
            required: false,
            serializedName: 'properties.storageAccountSubscriptionId',
            type: {
              name: 'String'
            }
          },
          isStorageSecondaryKeyInUse: {
            required: false,
            serializedName: 'properties.isStorageSecondaryKeyInUse',
            type: {
              name: 'Boolean'
            }
          },
          isAzureMonitorTargetEnabled: {
            required: false,
            serializedName: 'properties.isAzureMonitorTargetEnabled',
            type: {
              name: 'Boolean'
            }
          }
        }
      }
    };
  }
}

module.exports = ServerBlobAuditingPolicy;
