3 var BPromise = require('bluebird');
5 var logger = require('../config/logger')('migration');
6 var util = require('util');
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, indexName) {
65 this.sequence.enqueue(function() {
66 return _this.queryInterface.addIndex(table, column, {
70 logger.info('addIndex %s %s %s', table, column.join(','), indexName);
72 .catch(function(err) {
73 logger.info(JSON.stringify(err));
78 Migration.prototype.query = function(sql) {
80 this.sequence.enqueue(function() {
81 return _this.queryInterface.sequelize.query(sql)
83 logger.info('query %s', sql);
85 .catch(function(err) {
86 logger.info(JSON.stringify(err));
91 Migration.prototype.removeColumn = function(table, column) {
93 this.sequence.enqueue(function() {
94 return _this.queryInterface.removeColumn(table, column)
96 logger.info('Removed column %s from %s', column, table);
98 .catch(function(err) {
99 logger.info(util.inspect(err, {
107 Migration.prototype.final = function(resolve) {
109 this.sequence.enqueue(function() {
115 up: function(queryInterface, Sequelize) {
116 return new BPromise(function(resolve, reject) {
117 var migration = new Migration(queryInterface);
120 migration.addColumn('analytics_custom_reports', 'joins', {
124 migration.addColumn('analytics_default_reports', 'joins', {
129 // START CHAT MESSAGES
130 migration.query('ALTER TABLE `chat_messages` \
131 ADD CONSTRAINT `chat_messages_ibfk_5` \
132 FOREIGN KEY (`AttachmentId`) \
133 REFERENCES attachments(`id`) \
135 ON DELETE SET NULL');
138 // START CHAT WEBSITE
139 migration.addColumn('chat_websites', 'offline_chat_button', {
140 type: Sequelize.STRING,
143 migration.addColumn('chat_websites', 'enableCustomerAttachment', {
144 type: Sequelize.BOOLEAN,
149 // START CHAT INTERACTION
150 migration.addColumn('chat_interactions', 'referer', {
151 type: Sequelize.STRING
153 migration.addColumn('chat_interactions', 'customerIp', {
154 type: Sequelize.STRING
156 migration.addColumn('chat_interactions', 'ratingType', {
157 type: Sequelize.ENUM('star', 'thumb'),
160 migration.query('ALTER TABLE chat_interactions CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;');
161 // END CHAT INTERACTION
164 migration.addColumn('mail_messages', 'body', {
165 type: Sequelize.TEXT('long'),
168 migration.addColumn('mail_messages', 'read', {
169 type: Sequelize.BOOLEAN,
172 migration.addColumn('mail_messages', 'direction', {
173 type: Sequelize.ENUM('in', 'out'),
177 migration.changeColumn('mail_messages', 'messageId', {
178 type: Sequelize.STRING(190)
180 migration.removeColumn('mail_messages', 'inReplyTo');
181 migration.changeColumn('mail_messages', 'to', {
182 type: Sequelize.TEXT('long')
184 migration.changeColumn('mail_messages', 'cc', {
185 type: Sequelize.TEXT('long')
187 migration.changeColumn('mail_messages', 'bcc', {
188 type: Sequelize.TEXT('long')
190 migration.changeColumn('mail_messages', 'subject', {
193 migration.addColumn('mail_messages', 'sentAt', {
196 migration.addColumn('mail_messages', 'attach', {
197 type: Sequelize.INTEGER,
201 migration.removeColumn('mail_messages', 'fromId');
202 migration.removeColumn('mail_messages', 'attachment');
203 migration.removeColumn('mail_messages', 'text');
204 migration.removeColumn('mail_messages', 'html');
205 migration.removeColumn('mail_messages', 'reason');
206 migration.removeColumn('mail_messages', 'auto');
207 migration.removeColumn('mail_messages', 'status');
208 migration.removeColumn('mail_messages', 'retry');
209 migration.removeColumn('mail_messages', 'voiceSource');
210 migration.removeColumn('mail_messages', 'userName');
211 migration.removeColumn('mail_messages', 'userFullname');
212 migration.removeColumn('mail_messages', 'accountId');
213 migration.removeColumn('mail_messages', 'accountName');
214 migration.removeColumn('mail_messages', 'MailInteractionId');
216 migration.addColumn('mail_messages', 'MailAccountId', {
217 type: Sequelize.INTEGER,
219 migration.query('ALTER TABLE `mail_messages` \
220 ADD CONSTRAINT `mail_messages_ibfk_1` \
221 FOREIGN KEY (`MailAccountId`) \
222 REFERENCES mail_accounts(`id`) \
224 ON DELETE SET NULL');
226 migration.addColumn('mail_messages', 'MailInteractionId', {
227 type: Sequelize.INTEGER,
229 migration.query('ALTER TABLE `mail_messages` \
230 ADD CONSTRAINT `mail_messages_ibfk_2` \
231 FOREIGN KEY (`MailInteractionId`) \
232 REFERENCES mail_interactions(`id`) \
236 migration.addColumn('mail_messages', 'UserId', {
237 type: Sequelize.INTEGER,
239 migration.query('ALTER TABLE `mail_messages` \
240 ADD CONSTRAINT `mail_messages_ibfk_3` \
241 FOREIGN KEY (`UserId`) \
242 REFERENCES users(`id`) \
244 ON DELETE SET NULL');
246 migration.addColumn('mail_messages', 'ContactId', {
247 type: Sequelize.INTEGER,
249 migration.query('ALTER TABLE `mail_messages` \
250 ADD CONSTRAINT `mail_messages_ibfk_4` \
251 FOREIGN KEY (`ContactId`) \
252 REFERENCES cm_contacts(`id`) \
256 migration.query('ALTER TABLE mail_messages CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;');
258 migration.addColumn('mail_interactions', 'attach', {
259 type: Sequelize.BOOLEAN,
263 migration.addColumn('mail_accounts', 'signature', {
269 migration.removeColumn('tools_templates', 'subject');
273 migration.addColumn('users', 'phoneBarEnableDtmfTone', {
274 type: Sequelize.BOOLEAN,
277 migration.addColumn('users', 'phoneBarAutoAnswerDelay', {
278 type: Sequelize.INTEGER,
283 // START REPORT QUEUE MULTICHANNEL
284 migration.dropTable('report_openchannel');
285 migration.dropTable('report_openchannel_session');
286 migration.dropTable('report_chat');
287 migration.dropTable('report_chat_session');
288 migration.dropTable('report_fax');
289 migration.dropTable('report_fax_session');
290 migration.dropTable('report_mail');
291 migration.dropTable('report_mail_session');
292 migration.dropTable('report_sms');
293 migration.dropTable('report_sms_session');
294 // END REPORT QUEUE MULTICHANNEL
297 migration.addColumn('cm_hopper_history', 'editedat', {
300 migration.addColumn('cm_hopper_history', 'edited', {
301 type: Sequelize.BOOLEAN,
306 // START EDIT VOICE QUEUE / CAMPAIGN
307 migration.addColumn('voice_queues', 'dialOrderByScheduledAt', {
308 type: Sequelize.ENUM('DESC', 'ASC'),
311 migration.addColumn('campaigns', 'dialOrderByScheduledAt', {
312 type: Sequelize.ENUM('DESC', 'ASC'),
315 // END EDIT VOICE QUEUE
318 migration.final(resolve);
323 down: function(queryInterface, Sequelize) {
324 var migration = new Migration(queryInterface);