3 var BPromise = require('bluebird');
5 var logger = require('../config/logger')('migration');
6 var util = require('util');
7 var ejs = require('ejs');
8 var fs = require('fs');
9 var path = require('path');
10 var exec = require('child_process').exec;
12 var config = require('../config/environment');
14 var Sequence = function() {};
16 Sequence.prototype.enqueue = function(fn) {
17 this.tail = this.tail ? this.tail.finally(fn) : fn();
20 var Migration = function(queryInterface) {
21 this.queryInterface = queryInterface;
22 this.sequence = new Sequence();
25 Migration.prototype.changeColumn = function(table, column, type) {
27 this.sequence.enqueue(function() {
28 return _this.queryInterface
29 .changeColumn(table, column, type)
31 logger.info('Changed column %s in table %s', column, table);
33 .catch(function(err) {
34 logger.info(JSON.stringify(err));
39 Migration.prototype.addColumn = function(table, column, type) {
41 this.sequence.enqueue(function() {
42 return _this.queryInterface
43 .addColumn(table, column, type)
45 logger.info('Added column %s to %s', column, table);
47 .catch(function(err) {
48 logger.info(JSON.stringify(err));
53 Migration.prototype.dropTable = function(table) {
55 this.sequence.enqueue(function() {
56 return _this.queryInterface
61 logger.info('table dropped %s', table);
63 .catch(function(err) {
64 logger.info(JSON.stringify(err));
69 Migration.prototype.addIndex = function(table, column, indexName) {
71 this.sequence.enqueue(function() {
72 return _this.queryInterface.addIndex(table, column, {
76 logger.info('addIndex %s %s %s', table, column.join(','), indexName);
78 .catch(function(err) {
79 logger.info(JSON.stringify(err));
84 Migration.prototype.query = function(sql) {
86 this.sequence.enqueue(function() {
87 return _this.queryInterface.sequelize.query(sql)
89 logger.info('query %s', sql);
91 .catch(function(err) {
92 logger.info(JSON.stringify(err));
97 Migration.prototype.removeColumn = function(table, column) {
99 this.sequence.enqueue(function() {
100 return _this.queryInterface.removeColumn(table, column)
101 .then(function(res) {
102 logger.info('Removed column %s from %s', column, table);
104 .catch(function(err) {
105 logger.info(util.inspect(err, {
113 Migration.prototype.checkVoiceContexts = function() {
115 var VoiceContext = _this.queryInterface.sequelize.import(path.join(config.root, 'server/api/voiceContext/voiceContext.model'));
116 this.sequence.enqueue(function() {
117 return VoiceContext.findOrCreate({
119 name: 'xcally-mixmonitor-context'
122 name: 'xcally-mixmonitor-context',
123 description: 'default entry context (DO NOT DELETE)',
127 .spread(function(entity, created) {
133 .then(function(contexts) {
134 var templateContext = fs.readFileSync(path.join(config.root, 'server/files/templates/context.ejs'), 'utf8');
136 var contextsFile = ejs.render(templateContext, {
137 contexts: contexts || []
140 fs.writeFileSync('/etc/asterisk/extensions_xcally_contexts.conf', contextsFile);
142 exec('asterisk -rx "reload chan_sip.so"', function(err, stdout, stderr) {
143 logger.info('Exec chmod', ' Error :', JSON.stringify(err), stdout, stderr);
147 .catch(function(err) {
148 logger.info(JSON.stringify(err));
153 Migration.prototype.final = function(resolve) {
155 this.sequence.enqueue(function() {
161 up: function(queryInterface, Sequelize) {
162 return new BPromise(function(resolve, reject) {
163 var migration = new Migration(queryInterface);
165 migration.addColumn('settings', 'defaultPageTitle', {
166 type: Sequelize.BOOLEAN,
169 migration.addColumn('settings', 'pageTitle', {
170 type: Sequelize.STRING
174 // START VOICECONTEXT
175 migration.checkVoiceContexts();
178 // START SALESFORCE CONF
179 migration.addColumn('int_salesforce_configurations', 'moduleSearch', {
180 type: Sequelize.ENUM('contact_lead', 'contact', 'lead'),
181 defaultValue: 'contact_lead'
183 migration.addColumn('int_salesforce_configurations', 'moduleCreate', {
184 type: Sequelize.ENUM('nothing', 'contact', 'lead'),
187 // END SALESFORCE CONF
190 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '1', 'NoOp', '', 'system', 'Fax extensions auto generated', NOW(), NOW());");
192 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '2', 'Set', 'CDR(type)=outbound-fax', 'system', 'Fax extensions auto generated', NOW(), NOW());");
194 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '3', 'Wait', '6', 'system', 'Fax extensions auto generated', NOW(), NOW());");
196 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '4', 'Set', 'FAXOPT(ecm)=${XMF-ECM}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
198 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '5', 'Set', 'FAXOPT(headerinfo)=${XMF-HEADERINFO}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
200 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '6', 'Set', 'FAXOPT(localstationid)=${XMF-LOCALSTATIONID}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
202 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '7', 'Set', 'FAXOPT(maxrate)=${XMF-MAXRATE}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
204 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '8', 'Set', 'FAXOPT(minrate)=${XMF-MINRATE}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
206 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '9', 'Set', 'FAXOPT(modem)=${XMF-MODEM}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
208 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '10', 'Set', 'FAXOPT(t38timeout)=${XMF-T38TIMEOUT}', 'system', 'Fax extensions auto generated', NOW(), NOW());");
210 migration.query("INSERT INTO `voice_extensions` (`context`, `exten`, `priority`, `app`, `appdata`, `type`, `description`, `createdAt`, `updatedAt`) VALUES ('from-sip', 'xcally-motion-fax', '11', 'SendFax', '${XMF-PATH},d', 'system', 'Fax extensions auto generated', NOW(), NOW());");
212 exec('chmod 775 /var/opt/motion2/server/files/attachments', function(err, stdout, stderr) {
213 logger.info('Exec chmod', ' Error :', JSON.stringify(err), stdout, stderr);
214 exec('ls -la /var/opt/motion2/server/files', function(err, stdout, stderr) {
215 logger.info('Ls :', ' Error :', JSON.stringify(err), stdout, stderr);
221 migration.addColumn('cm_contacts', 'deletedAt', {
222 type: Sequelize.DATE,
228 migration.final(resolve);
233 down: function(queryInterface, Sequelize) {
234 var migration = new Migration(queryInterface);