UNPKG

deep-package-manager

Version:
175 lines (146 loc) 4.29 kB
/** * Created by CCristi on 2/6/17. */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.DynamoDBService = undefined; var _deepCore = require('deep-core'); var _deepCore2 = _interopRequireDefault(_deepCore); var _AbstractService = require('./AbstractService'); var _NoSuchModelException = require('../Exception/NoSuchModelException'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class DynamoDBService extends _AbstractService.AbstractService { /** * @param {Object[]} args */ constructor(...args) { super(...args); this._dynamoDb = null; } /** * @returns {String} */ name() { return _deepCore2.default.AWS.Service.DYNAMO_DB; } /** * @param {Object} dynamoDb */ set dynamoDb(dynamoDb) { this._dynamoDb = dynamoDb; } /** * @param {String} tableName * @returns {Promise} */ disableDynamoDBStreams(tableName) { return this._toggleDynamoDbStreamReplication(tableName, false); } /** * @param {String} tableName * @returns {Promise} */ enableDynamoDBStreams(tableName) { return this._toggleDynamoDbStreamReplication(tableName, true); } /** * @param {String} tableName * @param {Boolean} enable * @returns {Promise} * @private */ _toggleDynamoDbStreamReplication(tableName, enable) { return this._dynamoDb.describeTable({ TableName: tableName }).promise().then(response => { let tableConfig = response.Table; let streamSpecification = tableConfig.StreamSpecification || {}; let payload = null; if (enable) { if (streamSpecification.StreamEnabled && streamSpecification.StreamViewType === 'NEW_AND_OLD_IMAGES') { return Promise.resolve(tableConfig); } streamSpecification.StreamEnabled = true; streamSpecification.StreamViewType = 'NEW_AND_OLD_IMAGES'; payload = { TableName: tableConfig.TableName, StreamSpecification: streamSpecification }; } else { if (!streamSpecification.StreamEnabled) { return Promise.resolve(tableConfig); } payload = { TableName: tableConfig.TableName, StreamSpecification: { StreamEnabled: false } }; } return this._retryableRequest(this._dynamoDb.updateTable(payload)).promise() // recursive call to force table retrieve again .then(() => this.enableDynamoDBStreams(tableName)); }); } /** * @returns {Object} */ buildTableReplicationMap() { let map = {}; let reverseMap = {}; let blueTables = this.blueConfig().tablesNames; let greenTables = this.greenConfig().tablesNames; for (let tableName in blueTables) { if (blueTables.hasOwnProperty(tableName) && greenTables.hasOwnProperty(tableName)) { map[blueTables[tableName]] = greenTables[tableName]; reverseMap[greenTables[tableName]] = blueTables[tableName]; } else { console.warn(`Missing "${tableName}" model in Green Env!`); } } return Object.assign(map, reverseMap); } /** * @param {String} tableName * @returns {String|null} */ getAwsBlueTableName(tableName) { return this._getAwsTableName(tableName, this.blueConfig().tablesNames); } /** * @param {String} tableName * @returns {String|null} */ getAwsGreenTableName(tableName) { return this._getAwsTableName(tableName, this.greenConfig().tablesNames); } /** * @param {String} tableName * @param {Object} _tableNames * @returns {*} * @private */ _getAwsTableName(tableName, _tableNames) { for (let name in _tableNames) { if (!_tableNames.hasOwnProperty(name)) { continue; } if (name === tableName || _tableNames[name] === tableName) { return _tableNames[name]; } } throw new _NoSuchModelException.NoSuchModelException(tableName); } /** * @param {String} tableName * @returns {Promise} */ getItemCount(tableName) { return this._dynamoDb.describeTable({ TableName: tableName }).promise().then(response => response.Table.ItemCount); } } exports.DynamoDBService = DynamoDBService;