3 var BPromise = require('bluebird');
4 var util = require('util');
6 var logger = require('../config/logger')('migration');
8 var Sequence = function() {};
10 Sequence.prototype.enqueue = function(fn) {
11 this.tail = this.tail ? this.tail.finally(fn) : fn();
14 var Migration = function(queryInterface) {
15 this.queryInterface = queryInterface;
16 this.sequence = new Sequence();
19 Migration.prototype.changeColumn = function(table, column, type) {
21 this.sequence.enqueue(function() {
22 return _this.queryInterface
23 .changeColumn(table, column, type)
25 logger.info('Changed column %s in table %s', column, table);
27 .catch(function(err) {
28 logger.info(JSON.stringify(err));
33 Migration.prototype.addColumn = function(table, column, type) {
35 this.sequence.enqueue(function() {
36 return _this.queryInterface
37 .addColumn(table, column, type)
39 logger.info('Added column %s to %s', column, table);
41 .catch(function(err) {
42 logger.info(JSON.stringify(err));
47 Migration.prototype.dropTable = function(table) {
49 this.sequence.enqueue(function() {
50 return _this.queryInterface
55 logger.info('table dropped %s', table);
57 .catch(function(err) {
58 logger.info(JSON.stringify(err));
63 Migration.prototype.addIndex = function(table, column, options) {
65 this.sequence.enqueue(function() {
66 return _this.queryInterface
67 .addIndex(table, column, {
68 indexName: options.indexName,
69 indicesType: options.indicesType
72 logger.info('addIndex %s %s %s [%s]', table, column.join(','), options.indexName, options.indicesType);
74 .catch(function(err) {
75 logger.info(JSON.stringify(err));
80 Migration.prototype.removeIndex = function(table, indexName) {
82 this.sequence.enqueue(function() {
83 return _this.queryInterface
84 .removeIndex(table, indexName)
86 logger.info('removeIndex %s %s', table, indexName);
88 .catch(function(err) {
89 logger.info(JSON.stringify(err));
94 Migration.prototype.query = function(sql) {
96 this.sequence.enqueue(function() {
97 return _this.queryInterface.sequelize
100 logger.info('query %s', sql);
102 .catch(function(err) {
103 logger.info(JSON.stringify(err));
108 Migration.prototype.removeColumn = function(table, column) {
110 this.sequence.enqueue(function() {
111 return _this.queryInterface
112 .removeColumn(table, column)
114 logger.info('Removed column %s from %s', column, table);
116 .catch(function(err) {
127 Migration.prototype.renameColumn = function(table, oldColumn, newColumn) {
129 this.sequence.enqueue(function() {
130 return _this.queryInterface
131 .renameColumn(table, oldColumn, newColumn)
133 logger.info('Renamed column from %s to %s on %s', oldColumn, newColumn, table);
135 .catch(function(err) {
146 Migration.prototype.final = function(resolve) {
147 this.sequence.enqueue(function() {
153 up: function(queryInterface, Sequelize) {
154 return new BPromise(function(resolve) {
156 var migration = new Migration(queryInterface);
158 // START tools_actions
159 migration.query("UPDATE tools_actions SET data3 = 'phone' WHERE action = 'contactManager' AND data3 = '0'");
160 migration.query("UPDATE tools_actions SET data4 = NULL WHERE action = 'contactManager' AND data2 = '0' AND data4 = '0'");
161 migration.query("UPDATE tools_actions SET data4 = 'phone' WHERE action = 'contactManager' AND data4 = '0'");
165 migration.addColumn('settings', 'enforcePasswordHistory', {
166 type: Sequelize.BOOLEAN,
170 migration.addColumn('settings', 'passwordHistoryLimit', {
171 type: Sequelize.INTEGER(2).UNSIGNED,
181 migration.addColumn('users', 'previousPasswords', {
182 type: Sequelize.STRING,
183 after: 'passwordResetAt'
186 migration.addColumn('users', 'settingsEnabled', {
187 type: Sequelize.BOOLEAN,
192 // START cm_custom_fields
193 migration.addColumn('cm_custom_fields', 'clickToAction', {
194 type: Sequelize.BOOLEAN,
198 migration.addColumn('cm_custom_fields', 'actionType', {
199 type: Sequelize.ENUM('voice'),
201 defaultValue: 'voice'
203 // END cm_custom_fields
205 // START tools_disposition
206 migration.addColumn('tools_dispositions', 'level', {
207 type: Sequelize.ENUM('first', 'second', 'third'),
209 defaultValue: 'first',
213 migration.addColumn('tools_dispositions', 'description', {
214 type: Sequelize.STRING,
218 migration.addColumn('tools_dispositions', 'ParentId', {
219 type: Sequelize.INTEGER,
223 migration.query('ALTER TABLE tools_dispositions ADD CONSTRAINT `tools_dispositions_ibfk_8` FOREIGN KEY (`ParentId`) REFERENCES `tools_dispositions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE');
224 // END tools_disposition
227 migration.addColumn('report_call', 'userSecondDisposition', {
228 type: Sequelize.STRING,
229 after: "userDisposition"
232 migration.addColumn('report_call', 'userThirdDisposition', {
233 type: Sequelize.STRING,
234 after: "userSecondDisposition"
238 // START report_queue
239 migration.addColumn('report_queue', 'secondDisposition', {
240 type: Sequelize.STRING,
244 migration.addColumn('report_queue', 'thirdDisposition', {
245 type: Sequelize.STRING,
246 after: "secondDisposition"
250 // START voice_recordings
251 migration.addColumn('voice_recordings', 'userSecondDisposition', {
252 type: Sequelize.STRING,
253 after: "userDisposition"
256 migration.addColumn('voice_recordings', 'userThirdDisposition', {
257 type: Sequelize.STRING,
258 after: "userSecondDisposition"
260 // END voice_recordings
262 // START chat_interactions
263 migration.addColumn('chat_interactions', 'secondDisposition', {
264 type: Sequelize.STRING,
268 migration.addColumn('chat_interactions', 'thirdDisposition', {
269 type: Sequelize.STRING,
270 after: "secondDisposition"
272 // END chat_interactions
274 // START fax_interactions
275 migration.addColumn('fax_interactions', 'secondDisposition', {
276 type: Sequelize.STRING,
280 migration.addColumn('fax_interactions', 'thirdDisposition', {
281 type: Sequelize.STRING,
282 after: "secondDisposition"
284 // END fax_interactions
286 // START mail_interactions
287 migration.addColumn('mail_interactions', 'secondDisposition', {
288 type: Sequelize.STRING,
292 migration.addColumn('mail_interactions', 'thirdDisposition', {
293 type: Sequelize.STRING,
294 after: "secondDisposition"
296 // END mail_interactions
298 // START openchannel_interactions
299 migration.addColumn('openchannel_interactions', 'secondDisposition', {
300 type: Sequelize.STRING,
304 migration.addColumn('openchannel_interactions', 'thirdDisposition', {
305 type: Sequelize.STRING,
306 after: "secondDisposition"
308 // END openchannel_interactions
310 // START sms_interactions
311 migration.addColumn('sms_interactions', 'secondDisposition', {
312 type: Sequelize.STRING,
316 migration.addColumn('sms_interactions', 'thirdDisposition', {
317 type: Sequelize.STRING,
318 after: "secondDisposition"
320 // END sms_interactions
322 // START whatsapp_interactions
323 migration.addColumn('whatsapp_interactions', 'secondDisposition', {
324 type: Sequelize.STRING,
328 migration.addColumn('whatsapp_interactions', 'thirdDisposition', {
329 type: Sequelize.STRING,
330 after: "secondDisposition"
332 // END whatsapp_interactions
334 // START cm_hopper_final
335 migration.addColumn('cm_hopper_final', 'secondDisposition', {
336 type: Sequelize.STRING,
340 migration.addColumn('cm_hopper_final', 'thirdDisposition', {
341 type: Sequelize.STRING,
342 after: "secondDisposition"
344 // END cm_hopper_final
347 migration.final(resolve);
352 down: function(queryInterface, Sequelize) {
353 // var migration = new Migration(queryInterface);