--- /dev/null
+'use strict';
+
+var BPromise = require('bluebird');
+var util = require('util');
+var logger = require('../config/logger')('migration');
+var Sequence = function() {};
+
+Sequence.prototype.enqueue = function(fn) {
+ this.tail = this.tail ? this.tail.finally(fn) : fn();
+};
+
+var Migration = function(queryInterface) {
+ this.queryInterface = queryInterface;
+ this.sequence = new Sequence();
+};
+
+Migration.prototype.changeColumn = function(table, column, type) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .changeColumn(table, column, type)
+ .then(function() {
+ logger.info('Changed column %s in table %s', column, table);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.addColumn = function(table, column, type) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .addColumn(table, column, type)
+ .then(function() {
+ logger.info('Added column %s to %s', column, table);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.dropTable = function(table) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .dropTable(table, {
+ force: true,
+ })
+ .then(function() {
+ logger.info('table dropped %s', table);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.addIndex = function(table, column, indexName) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .addIndex(table, column, {
+ indexName: indexName,
+ })
+ .then(function() {
+ logger.info('addIndex %s %s %s', table, column.join(','), indexName);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.removeIndex = function(table, indexName) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .removeIndex(table, indexName)
+ .then(function() {
+ logger.info('removeIndex %s %s', table, indexName);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.query = function(sql) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface.sequelize
+ .query(sql)
+ .then(function() {
+ logger.info('query %s', sql);
+ })
+ .catch(function(err) {
+ logger.info(JSON.stringify(err));
+ });
+ });
+};
+
+Migration.prototype.removeColumn = function(table, column) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .removeColumn(table, column)
+ .then(function() {
+ logger.info('Removed column %s from %s', column, table);
+ })
+ .catch(function(err) {
+ logger.info(
+ util.inspect(err, {
+ showHidden: false,
+ depth: null,
+ })
+ );
+ });
+ });
+};
+
+Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
+ var _this = this;
+ this.sequence.enqueue(function() {
+ return _this.queryInterface
+ .renameColumn(table, oldColumn, newColumn)
+ .then(function() {
+ logger.info(
+ 'Renamed column from %s to %s on %s',
+ oldColumn,
+ newColumn,
+ table
+ );
+ })
+ .catch(function(err) {
+ logger.info(
+ util.inspect(err, {
+ showHidden: false,
+ depth: null,
+ })
+ );
+ });
+ });
+};
+
+Migration.prototype.final = function(resolve) {
+ this.sequence.enqueue(function() {
+ return resolve();
+ });
+};
+
+const MOTV24448 = {
+ /**
+ * Apply up migration for MOTV2-4448
+ * @link https://xcally.atlassian.net/browse/MOTV2-4448
+ * @param {Migration} migration
+ * @returns {Promise<void>}
+ * @constructor
+ */
+ up: function(migration) {
+ return migration.query('ALTER TABLE `chat_websites` DROP INDEX `address`')
+ },
+ /**
+ * Apply down migration for MOTV2-4448
+ * @link https://xcally.atlassian.net/browse/MOTV2-4448
+ * @param {Migration} migration
+ * @returns {Promise<void>}
+ * @constructor
+ */
+ down: function(migration) {
+ return migration.query(
+ 'ALTER TABLE `chat_websites` ADD CONSTRAINT address UNIQUE(address)'
+ ).
+ catch(function() {
+ migration.log(
+ "WARNING: can't add unique constraint to chat_websites.address: the table contains duplicate values"
+ )
+ });
+ },
+}
+
+
+module.exports = {
+ up: function(queryInterface /*, Sequelize */ ) {
+ return new BPromise(function(resolve) {
+ var migration = new Migration(queryInterface);
+ // Add your migration code here
+ MOTV24448.up(migration)
+
+ /**
+ * @see https://xcally.atlassian.net/browse/MOTV2-4430
+ */
+ migration.removeColumn('voice_extensions', 'alias');
+
+ // START FINAL
+ migration.final(resolve);
+ // END FINAL
+ });
+ },
+
+ down: function(queryInterface /*, Sequelize */ ) {
+ return new BPromise(function(resolve) {
+ var migration = new Migration(queryInterface);
+ MOTV24448.down(migration)
+ // START FINAL
+ migration.final(resolve);
+ });
+ },
+};
\ No newline at end of file