From 006e4aa116cff6ca5fcd3d86a28b05d5b3d58c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20D=C3=BCver?= Date: Wed, 25 Apr 2018 18:15:14 +0200 Subject: [PATCH 1/4] Add segment support to triggers frontend --- routes/triggers.js | 188 +++++++++++++++++++------------ views/triggers/create-select.hbs | 12 +- views/triggers/create.hbs | 2 +- views/triggers/edit.hbs | 2 +- views/triggers/triggers.hbs | 2 +- 5 files changed, 132 insertions(+), 74 deletions(-) diff --git a/routes/triggers.js b/routes/triggers.js index 6e42aec7..331b82b7 100644 --- a/routes/triggers.js +++ b/routes/triggers.js @@ -5,6 +5,7 @@ let router = new express.Router(); let triggers = require('../lib/models/triggers'); let campaigns = require('../lib/models/campaigns'); let lists = require('../lib/models/lists'); +let segments = require('../lib/models/segments'); let fields = require('../lib/models/fields'); let striptags = require('striptags'); let passport = require('../lib/passport'); @@ -58,15 +59,23 @@ router.get('/create-select', passport.csrfProtection, (req, res, next) => { }); router.post('/create-select', passport.parseForm, passport.csrfProtection, (req, res) => { - if (!req.body.list) { + // Check if req.body.list is in correct format ("listId:segmentId") + if (!req.body.list || !/([\d]+):([\d]+)/.test(req.body.list)) { req.flash('danger', _('Could not find selected list')); return res.redirect('/triggers/create-select'); } - res.redirect('/triggers/' + encodeURIComponent(req.body.list) + '/create'); + + let listId = parseInt(req.body.list.split(':')[0]); + let segmentId = parseInt(req.body.list.split(':')[1]); + + res.redirect('/triggers/' + encodeURIComponent(listId) + '/' + encodeURIComponent(segmentId) + '/create'); }); -router.get('/:listId/create', passport.csrfProtection, (req, res, next) => { +router.get('/:listId/:segmentId/create', passport.csrfProtection, (req, res, next) => { + let listId = parseInt(req.params.listId); + let segmentId = parseInt(req.params.segmentId); + let data = tools.convertKeys(req.query, { skip: ['layout'] }); @@ -74,52 +83,69 @@ router.get('/:listId/create', passport.csrfProtection, (req, res, next) => { data.csrfToken = req.csrfToken(); data.days = Math.max(Number(data.days) || 1, 1); - lists.get(req.params.listId, (err, list) => { + lists.get(listId, (err, list) => { if (err || !list) { req.flash('danger', err && err.message || err || _('Could not find selected list')); return res.redirect('/triggers/create-select'); } - fields.list(list.id, (err, fieldList) => { - if (err && !fieldList) { - fieldList = []; + + segments.get(segmentId, (err, segment) => { + if (segmentId > 0 && err) { + req.flash('danger', err && err.message || err || _('Error while finding selected segment')); + return res.redirect('/triggers/create-select'); } - data.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ - column: field.column, - name: field.name, - selected: data.column === field.column - })); - - campaigns.list(0, 300, (err, campaignList) => { - if (err) { - return next(err); + segments.subscribers(segmentId, true, (err, segmentSubscribers) => { + if (segmentId > 0 && err) { + req.flash('danger', err && err.message || err || _('Error while finding selected segment')); + return res.redirect('/triggers/create-select'); } - data.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ - id: campaign.id, - name: campaign.name, - selected: Number(data.sourceCampaign) === campaign.id - })); + fields.list(list.id, (err, fieldList) => { + if (err && !fieldList) { + fieldList = []; + } - data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({ - id: campaign.id, - name: campaign.name, - selected: Number(data.destCampaign) === campaign.id - })); + data.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ + column: field.column, + name: field.name, + selected: data.column === field.column + })); - data.list = list; - data.isSubscription = data.rule === 'subscription' || !data.rule; - data.isCampaign = data.rule === 'campaign'; + campaigns.list(0, 300, (err, campaignList) => { + if (err) { + return next(err); + } - data.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ - option: evt.option, - name: evt.name, - selected: Number(data.sourceCampaign) === evt.option - })); + data.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ + id: campaign.id, + name: campaign.name, + selected: Number(data.sourceCampaign) === campaign.id + })); - data.isSend = true; + data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && (segmentId <= 0 || campaign.segment === segmentId) && campaign.type === 4).map(campaign => ({ + id: campaign.id, + name: campaign.name, + selected: Number(data.destCampaign) === campaign.id + })); - res.render('triggers/create', data); + data.list = list; + data.segment = segment; + data.segmentSubscribers = segmentSubscribers; + data.isSubscription = data.rule === 'subscription' || !data.rule; + data.isCampaign = data.rule === 'campaign'; + + data.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ + option: evt.option, + name: evt.name, + selected: Number(data.sourceCampaign) === evt.option + })); + + data.isSend = true; + + res.render('triggers/create', data); + }); + }); }); }); }); @@ -154,51 +180,73 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => { req.flash('danger', err && err.message || err || _('Could not find selected list')); return res.redirect('/triggers'); } - fields.list(list.id, (err, fieldList) => { - if (err && !fieldList) { - fieldList = []; + + segments.get(trigger.segment, (err, segment) => { + if (trigger.segment > 0 && err) { + req.flash('danger', err && err.message || err || _('Error while finding selected segment')); + return res.redirect('/triggers'); + } + + let segmentId = 0; + if (trigger.segment > 0) { + segmentId = segment.id; } - campaigns.list(0, 300, (err, campaignList) => { - if (err) { - return next(err); + segments.subscribers(segmentId, true, (err, segmentSubscribers) => { + if (trigger.segment > 0 && err) { + req.flash('danger', err && err.message || err || _('Error while finding selected segment subscribers')); + return res.redirect('/triggers'); } - trigger.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ - id: campaign.id, - name: campaign.name, - selected: Number(trigger.sourceCampaign) === campaign.id - })); + fields.list(list.id, (err, fieldList) => { + if (err && !fieldList) { + fieldList = []; + } - trigger.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({ - id: campaign.id, - name: campaign.name, - selected: Number(trigger.destCampaign) === campaign.id - })); + campaigns.list(0, 300, (err, campaignList) => { + if (err) { + return next(err); + } - trigger.list = list; - trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule; - trigger.isCampaign = trigger.rule === 'campaign'; + trigger.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ + id: campaign.id, + name: campaign.name, + selected: Number(trigger.sourceCampaign) === campaign.id + })); - trigger.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ - column: field.column, - name: field.name, - selected: trigger.isSubscription && trigger.column === field.column - })); + trigger.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({ + id: campaign.id, + name: campaign.name, + selected: Number(trigger.destCampaign) === campaign.id + })); - trigger.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ - option: evt.option, - name: evt.name, - selected: trigger.isCampaign && trigger.column === evt.option - })); + trigger.list = list; + trigger.segment = segment; + trigger.segmentSubscribers = segmentSubscribers; + trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule; + trigger.isCampaign = trigger.rule === 'campaign'; - if (trigger.rule !== 'subscription') { - trigger.column = null; - } + trigger.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ + column: field.column, + name: field.name, + selected: trigger.isSubscription && trigger.column === field.column + })); - trigger.isSend = true; + trigger.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ + option: evt.option, + name: evt.name, + selected: trigger.isCampaign && trigger.column === evt.option + })); - res.render('triggers/edit', trigger); + if (trigger.rule !== 'subscription') { + trigger.column = null; + } + + trigger.isSend = true; + + res.render('triggers/edit', trigger); + }); + }); }); }); }); diff --git a/views/triggers/create-select.hbs b/views/triggers/create-select.hbs index d36aab59..ab14c1be 100644 --- a/views/triggers/create-select.hbs +++ b/views/triggers/create-select.hbs @@ -17,9 +17,19 @@ diff --git a/views/triggers/create.hbs b/views/triggers/create.hbs index d79ec27f..8152b5dc 100644 --- a/views/triggers/create.hbs +++ b/views/triggers/create.hbs @@ -30,7 +30,7 @@
-

{{list.name}} – {{list.subscribers}} {{#translate}}subscribers{{/translate}}

+

{{list.name}} {{#if segment.id}}– {{segment.name}}{{/if}} – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}

diff --git a/views/triggers/edit.hbs b/views/triggers/edit.hbs index ccee4e21..62c3c437 100644 --- a/views/triggers/edit.hbs +++ b/views/triggers/edit.hbs @@ -43,7 +43,7 @@
-

{{list.name}} – {{list.subscribers}} {{#translate}}subscribers{{/translate}}

+

{{list.name}} {{#if segment.id}}– {{segment.name}}{{/if}} – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}

diff --git a/views/triggers/triggers.hbs b/views/triggers/triggers.hbs index 92e42e7a..d21869f2 100644 --- a/views/triggers/triggers.hbs +++ b/views/triggers/triggers.hbs @@ -64,7 +64,7 @@ {{description}} - {{listName}} + {{listName}}{{#if segment}} - {{segmentName}}{{/if}} {{{formatted}}} From 52f4213cb7108d5b89141a2ca713a844eb18eba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20D=C3=BCver?= Date: Wed, 25 Apr 2018 18:16:51 +0200 Subject: [PATCH 2/4] Add segment support to triggers model and database --- lib/models/triggers.js | 99 ++++++++++++++++++++++++++----------- services/triggers.js | 4 +- setup/sql/upgrade-00030.sql | 12 +++++ 3 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 setup/sql/upgrade-00030.sql diff --git a/lib/models/triggers.js b/lib/models/triggers.js index 6d2e49c6..b87125c4 100644 --- a/lib/models/triggers.js +++ b/lib/models/triggers.js @@ -1,8 +1,10 @@ 'use strict'; +let log = require('npmlog'); let tools = require('../tools'); let db = require('../db'); let lists = require('./lists'); +let segments = require('./segments'); let util = require('util'); let _ = require('../translate')._; let tableHelpers = require('../table-helpers'); @@ -55,7 +57,9 @@ module.exports.list = callback => { '`triggers`.`description` AS `description`', '`triggers`.`enabled` AS `enabled`', '`triggers`.`list` AS `list`', + '`triggers`.`segment` AS `segment`', '`lists`.`name` AS `list_name`', + '`segments`.`name` AS `segment_name`', '`source`.`id` AS `source_campaign`', '`source`.`name` AS `source_campaign_name`', '`dest`.`id` AS `dest_campaign`', @@ -69,7 +73,7 @@ module.exports.list = callback => { '`triggers`.`created` AS `created`' ]; - let query = 'SELECT ' + tableFields.join(', ') + ' FROM `triggers` LEFT JOIN `campaigns` `source` ON `source`.`id`=`triggers`.`source_campaign` LEFT JOIN `campaigns` `dest` ON `dest`.`id`=`triggers`.`dest_campaign` LEFT JOIN `lists` ON `lists`.`id`=`triggers`.`list` LEFT JOIN `custom_fields` ON `custom_fields`.`list` = `triggers`.`list` AND `custom_fields`.`column`=`triggers`.`column` ORDER BY `triggers`.`name`'; + let query = 'SELECT ' + tableFields.join(', ') + ' FROM `triggers` LEFT JOIN `campaigns` `source` ON `source`.`id`=`triggers`.`source_campaign` LEFT JOIN `campaigns` `dest` ON `dest`.`id`=`triggers`.`dest_campaign` LEFT JOIN `lists` ON `lists`.`id`=`triggers`.`list` LEFT JOIN `segments` ON `segments`.`id`=`triggers`.`segment` LEFT JOIN `custom_fields` ON `custom_fields`.`list` = `triggers`.`list` AND `custom_fields`.`column`=`triggers`.`column` ORDER BY `triggers`.`name`'; connection.query(query, (err, rows) => { connection.release(); if (err) { @@ -105,32 +109,70 @@ module.exports.getQuery = (id, callback) => { let intervalQuery = (column, seconds, treshold) => column + ' <= NOW() - INTERVAL ' + seconds + ' SECOND AND ' + column + ' >= NOW() - INTERVAL ' + (treshold + seconds) + ' SECOND'; - let query = false; - switch (trigger.rule) { - case 'subscription': - query = 'SELECT id FROM `subscription__' + trigger.list + '` subscription WHERE ' + intervalQuery('`' + trigger.column + '`', trigger.seconds, treshold) + ' AND id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; - case 'campaign': - switch (trigger.column) { - case 'delivered': - query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; - case 'not_clicked': - query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; - case 'not_opened': - query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; - case 'clicked': - query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; - case 'opened': - query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; - break; + + let getSegmentQuery = (segmentId, next) => { + segmentId = Number(segmentId); + if (!segmentId) { + return next(null, { + where: '', + values: [] + }); + } + + segments.getQuery(segmentId, 'subscription', next); + }; + + getSegmentQuery(trigger.segment, (err, queryData) => { + if (err) { + log.err('Triggers', err); + return null; + } + + let query = false; + let querySegmentSubscription = ''; + let querySegmentTriggertable = ''; + if (trigger.segment > 0) + { + querySegmentSubscription = (queryData.where ? ' AND (' + queryData.where + ')' : ''); + querySegmentTriggertable = ' AND triggertable.`segment` = ' + trigger.segment; + } + + switch (trigger.rule) { + case 'subscription': + query = 'SELECT id FROM `subscription__' + trigger.list + '` subscription WHERE status=1 AND ' + intervalQuery('`' + trigger.column + '`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + case 'campaign': + switch (trigger.column) { + case 'delivered': + query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + case 'not_clicked': + query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + case 'not_opened': + query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + case 'clicked': + query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + case 'opened': + query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit; + break; + } + break; + } + + if (trigger.segment > 0) { + let values = queryData.values.concat([trigger.list, trigger.segment]); + for (let i = 0; i < values.length; i++) { + query = query.replace('?', db.escape(values[i])); } - break; - } - callback(null, query); + } + + callback(null, query); + + }); + }); }; @@ -168,6 +210,7 @@ module.exports.create = (trigger, callback) => { let name = (trigger.name || '').toString().trim(); let description = (trigger.description || '').toString().trim(); let listId = Number(trigger.list) || 0; + let segmentId = Number(trigger.segmentId) || 0; let seconds = (Number(trigger.days) || 0) * 24 * 3600; let rule = (trigger.rule || '').toString().toLowerCase().trim(); let destCampaign = Number(trigger.destCampaign) || 0; @@ -220,8 +263,8 @@ module.exports.create = (trigger, callback) => { return callback(err); } - let keys = ['name', 'description', 'list', 'source_campaign', 'rule', 'column', 'seconds', 'dest_campaign', 'last_check']; - let values = [name, description, list.id, sourceCampaign, rule, column, seconds, destCampaign]; + let keys = ['name', 'description', 'list', 'segment', 'source_campaign', 'rule', 'column', 'seconds', 'dest_campaign', 'last_check']; + let values = [name, description, list.id, segmentId, sourceCampaign, rule, column, seconds, destCampaign]; let query = 'INSERT INTO `triggers` (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(', ') + ', NOW())'; diff --git a/services/triggers.js b/services/triggers.js index d223c573..c08013c7 100644 --- a/services/triggers.js +++ b/services/triggers.js @@ -82,8 +82,8 @@ function fireTrigger(trigger, callback) { } let subscriber = rows[pos++].id; - let query = 'INSERT INTO `trigger__' + trigger.id + '` (`list`, `subscription`) VALUES (?,?)'; - let values = [trigger.list, subscriber]; + let query = 'INSERT INTO `trigger__' + trigger.id + '` (`list`, `segment`, `subscription`) VALUES (?,?,?)'; + let values = [trigger.list, trigger.segment, subscriber]; connection.query(query, values, (err, result) => { if (err && err.code !== 'ER_DUP_ENTRY') { diff --git a/setup/sql/upgrade-00030.sql b/setup/sql/upgrade-00030.sql new file mode 100644 index 00000000..66560e04 --- /dev/null +++ b/setup/sql/upgrade-00030.sql @@ -0,0 +1,12 @@ +# Header section +# Define incrementing schema version number +SET @schema_version = '30'; + +# Add segment support for triggers +ALTER TABLE `triggers` ADD `segment` INT(11) UNSIGNED NOT NULL AFTER `list`; +ALTER TABLE `trigger` ADD `segment` INT(11) UNSIGNED NOT NULL AFTER `list`; + +# Footer section +LOCK TABLES `settings` WRITE; +INSERT INTO `settings` (`key`, `value`) VALUES('db_schema_version', @schema_version) ON DUPLICATE KEY UPDATE `value`=@schema_version; +UNLOCK TABLES; From 80f2fe1b26bfd25a3be9b69eff0dbfe4cdf27964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20D=C3=BCver?= Date: Wed, 25 Apr 2018 18:18:36 +0200 Subject: [PATCH 3/4] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e427313b..51e18bf3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mailtrain", "private": true, - "version": "1.23.2", + "version": "1.24.0", "description": "Self hosted email newsletter app", "main": "index.js", "scripts": { From 102c46c3fbd86c36020a29afb1de514f2789ad3f Mon Sep 17 00:00:00 2001 From: Tomas Bures Date: Sun, 5 Aug 2018 17:08:24 +0530 Subject: [PATCH 4/4] Bumped version in meta.json. Otherwise the sql updates are not executed. --- meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta.json b/meta.json index c0a6d3c0..5d511080 100644 --- a/meta.json +++ b/meta.json @@ -1,3 +1,3 @@ { - "schemaVersion": 29 + "schemaVersion": 30 }