Merged pull request #412
This commit is contained in:
commit
fe7d34e0f6
10 changed files with 219 additions and 106 deletions
|
@ -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())';
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"schemaVersion": 30
|
||||
"schemaVersion": 31
|
||||
}
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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') {
|
||||
|
|
12
setup/sql/upgrade-00031.sql
Normal file
12
setup/sql/upgrade-00031.sql
Normal file
|
@ -0,0 +1,12 @@
|
|||
# Header section
|
||||
# Define incrementing schema version number
|
||||
SET @schema_version = '31';
|
||||
|
||||
# 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;
|
|
@ -17,9 +17,19 @@
|
|||
<select class="form-control" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}">
|
||||
<option value="{{id}}:0">
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> – {{list.subscribers}} {{#translate}}subscribers{{/translate}}</span></p>
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> {{#if segment.id}}– <a href="/lists/view/{{list.id}}?segment={{segment.id}}">{{segment.name}}</a>{{/if}} <span class="text-muted"> – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}</span><input id="segmentId" name="segmentId" type="hidden" value="{{segment.id}}"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> – {{list.subscribers}} {{#translate}}subscribers{{/translate}}</span></p>
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> {{#if segment.id}}– <a href="/lists/view/{{list.id}}?segment={{segment.id}}">{{segment.name}}</a>{{/if}} <span class="text-muted"> – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}</span><input id="segmentId" name="segmentId" type="hidden" value="{{segment.id}}"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
{{description}}
|
||||
</td>
|
||||
<td class="text-info">
|
||||
<a href="/lists/view/{{list}}">{{listName}}</a>
|
||||
<a href="/lists/view/{{list}}">{{listName}}</a>{{#if segment}} - <a href="/lists/view/{{list}}?segment={{segment}}">{{segmentName}}</a>{{/if}}
|
||||
</td>
|
||||
<td class="text-info">
|
||||
{{{formatted}}}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue