Display a list of triggered users
This commit is contained in:
parent
fe2a6651f1
commit
eab46d758a
9 changed files with 189 additions and 6 deletions
|
@ -172,7 +172,6 @@ module.exports.filter = (listId, request, columns, segmentId, callback) => {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
module.exports.addConfirmation = (list, email, data, callback) => {
|
module.exports.addConfirmation = (list, email, data, callback) => {
|
||||||
let cid = shortid.generate();
|
let cid = shortid.generate();
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@ module.exports.list = callback => {
|
||||||
'`source`.`name` AS `source_campaign_name`',
|
'`source`.`name` AS `source_campaign_name`',
|
||||||
'`dest`.`id` AS `dest_campaign`',
|
'`dest`.`id` AS `dest_campaign`',
|
||||||
'`dest`.`name` AS `dest_campaign_name`',
|
'`dest`.`name` AS `dest_campaign_name`',
|
||||||
|
'`triggers`.`count` AS `count`',
|
||||||
'`custom_fields`.`id` AS `column_id`',
|
'`custom_fields`.`id` AS `column_id`',
|
||||||
'`triggers`.`column` AS `column`',
|
'`triggers`.`column` AS `column`',
|
||||||
'`custom_fields`.`name` AS `column_name`',
|
'`custom_fields`.`name` AS `column_name`',
|
||||||
|
@ -336,6 +337,73 @@ module.exports.delete = (id, callback) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports.filterSubscribers = (trigger, request, columns, callback) => {
|
||||||
|
db.getConnection((err, connection) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
let query = 'SELECT COUNT(`subscription__' + trigger.list + '`.`id`) AS total FROM `subscription__' + trigger.list + '` JOIN `trigger__' + trigger.id + '` ON `trigger__' + trigger.id + '`.`list`=? AND `trigger__' + trigger.id + '`.`subscription`=`subscription__' + trigger.list + '`.`id`';
|
||||||
|
let values = [trigger.list];
|
||||||
|
|
||||||
|
connection.query(query, values, (err, total) => {
|
||||||
|
if (err) {
|
||||||
|
connection.release();
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
total = total && total[0] && total[0].total || 0;
|
||||||
|
|
||||||
|
let ordering = [];
|
||||||
|
|
||||||
|
if (request.order && request.order.length) {
|
||||||
|
|
||||||
|
request.order.forEach(order => {
|
||||||
|
let orderField = columns[Number(order.column)];
|
||||||
|
let orderDirection = (order.dir || '').toString().toLowerCase() === 'desc' ? 'DESC' : 'ASC';
|
||||||
|
if (orderField) {
|
||||||
|
ordering.push('`' + orderField + '` ' + orderDirection);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ordering.length) {
|
||||||
|
ordering.push('`email` ASC');
|
||||||
|
}
|
||||||
|
|
||||||
|
let args = [Number(request.length) || 50, Number(request.start) || 0];
|
||||||
|
|
||||||
|
if (request.search && request.search.value) {
|
||||||
|
query = 'SELECT SQL_CALC_FOUND_ROWS * FROM `subscription__' + trigger.list + '` JOIN `trigger__' + trigger.id + '` ON `trigger__' + trigger.id + '`.`list`=? AND `trigger__' + trigger.id + '`.`subscription`=`subscription__' + trigger.list + '`.`id AND (email LIKE ? OR first_name LIKE ? OR last_name LIKE ?) ORDER BY ' + ordering.join(', ') + ' LIMIT ? OFFSET ?';
|
||||||
|
|
||||||
|
let searchVal = '%' + request.search.value.replace(/\\/g, '\\\\').replace(/([%_])/g, '\\$1') + '%';
|
||||||
|
args = values.concat([searchVal, searchVal, searchVal]).concat(args);
|
||||||
|
} else {
|
||||||
|
query = 'SELECT SQL_CALC_FOUND_ROWS * FROM `subscription__' + trigger.list + '` JOIN `trigger__' + trigger.id + '` ON `trigger__' + trigger.id + '`.`list`=? AND `trigger__' + trigger.id + '`.`subscription`=`subscription__' + trigger.list + '`.`id` ORDER BY ' + ordering.join(', ') + ' LIMIT ? OFFSET ?';
|
||||||
|
args = values.concat(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
connection.query(query, args, (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
connection.release();
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
connection.query('SELECT FOUND_ROWS() AS total', (err, filteredTotal) => {
|
||||||
|
connection.release();
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
let subscriptions = rows.map(row => tools.convertKeys(row));
|
||||||
|
|
||||||
|
filteredTotal = filteredTotal && filteredTotal[0] && filteredTotal[0].total || 0;
|
||||||
|
return callback(null, subscriptions, total, filteredTotal);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
function createTriggerTable(id, callback) {
|
function createTriggerTable(id, callback) {
|
||||||
db.getConnection((err, connection) => {
|
db.getConnection((err, connection) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"schemaVersion": 15
|
"schemaVersion": 16
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ let fields = require('../lib/models/fields');
|
||||||
let striptags = require('striptags');
|
let striptags = require('striptags');
|
||||||
let passport = require('../lib/passport');
|
let passport = require('../lib/passport');
|
||||||
let tools = require('../lib/tools');
|
let tools = require('../lib/tools');
|
||||||
|
let htmlescape = require('escape-html');
|
||||||
|
|
||||||
router.all('/*', (req, res, next) => {
|
router.all('/*', (req, res, next) => {
|
||||||
if (!req.user) {
|
if (!req.user) {
|
||||||
|
@ -231,5 +232,53 @@ router.post('/delete', passport.parseForm, passport.csrfProtection, (req, res) =
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.get('/status/:id', passport.csrfProtection, (req, res) => {
|
||||||
|
let id = Number(req.params.id) || 0;
|
||||||
|
|
||||||
|
triggers.get(id, (err, trigger) => {
|
||||||
|
if (err || !trigger) {
|
||||||
|
req.flash('danger', err && err.message || err || 'Could not find trigger with specified ID');
|
||||||
|
return res.redirect('/triggers');
|
||||||
|
}
|
||||||
|
|
||||||
|
trigger.csrfToken = req.csrfToken();
|
||||||
|
res.render('triggers/triggered', trigger);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/status/ajax/:id', (req, res) => {
|
||||||
|
triggers.get(req.params.id, (err, trigger) => {
|
||||||
|
if (err || !trigger) {
|
||||||
|
return res.json({
|
||||||
|
error: err && err.message || err || 'Trigger not found',
|
||||||
|
data: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let columns = ['#', 'email', 'first_name', 'last_name', 'trigger__' + trigger.id + '`.`created'];
|
||||||
|
triggers.filterSubscribers(trigger, req.body, columns, (err, data, total, filteredTotal) => {
|
||||||
|
if (err) {
|
||||||
|
return res.json({
|
||||||
|
error: err.message || err,
|
||||||
|
data: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
draw: req.body.draw,
|
||||||
|
recordsTotal: total,
|
||||||
|
recordsFiltered: filteredTotal,
|
||||||
|
data: data.map((row, i) => [
|
||||||
|
(Number(req.body.start) || 0) + 1 + i,
|
||||||
|
htmlescape(row.email || ''),
|
||||||
|
htmlescape(row.firstName || ''),
|
||||||
|
htmlescape(row.lastName || ''),
|
||||||
|
'<span class="datestring" data-date="' + row.created.toISOString() + '" title="' + row.created.toISOString() + '">' + row.created.toISOString() + '</span>',
|
||||||
|
'<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span><a href="/lists/subscription/' + trigger.list + '/edit/' + row.cid + '">Edit</a>'
|
||||||
|
])
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|
|
@ -99,7 +99,10 @@ function fireTrigger(trigger, callback) {
|
||||||
connection.release();
|
connection.release();
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
return setImmediate(insertNext);
|
// update counter
|
||||||
|
let query = 'UPDATE `triggers` SET `count`=`count`+1 WHERE id=?';
|
||||||
|
let values = [trigger.id];
|
||||||
|
connection.query(query, values, () => setImmediate(insertNext));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -194,7 +194,7 @@ CREATE TABLE `settings` (
|
||||||
`value` text NOT NULL,
|
`value` text NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `key` (`key`)
|
UNIQUE KEY `key` (`key`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4;
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (1,'smtp_hostname','localhost');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (1,'smtp_hostname','localhost');
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (2,'smtp_port','465');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (2,'smtp_port','465');
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (3,'smtp_encryption','TLS');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (3,'smtp_encryption','TLS');
|
||||||
|
@ -211,7 +211,7 @@ INSERT INTO `settings` (`id`, `key`, `value`) VALUES (13,'default_from','My Awes
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (14,'default_address','admin@example.com');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (14,'default_address','admin@example.com');
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (15,'default_subject','Test message');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (15,'default_subject','Test message');
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (16,'default_homepage','http://localhost:3000/');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (16,'default_homepage','http://localhost:3000/');
|
||||||
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (17,'db_schema_version','15');
|
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (17,'db_schema_version','16');
|
||||||
CREATE TABLE `subscription` (
|
CREATE TABLE `subscription` (
|
||||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
`cid` varchar(255) CHARACTER SET ascii NOT NULL,
|
`cid` varchar(255) CHARACTER SET ascii NOT NULL,
|
||||||
|
@ -267,6 +267,7 @@ CREATE TABLE `triggers` (
|
||||||
`column` varchar(255) CHARACTER SET ascii DEFAULT NULL,
|
`column` varchar(255) CHARACTER SET ascii DEFAULT NULL,
|
||||||
`seconds` int(11) NOT NULL DEFAULT '0',
|
`seconds` int(11) NOT NULL DEFAULT '0',
|
||||||
`dest_campaign` int(11) unsigned DEFAULT NULL,
|
`dest_campaign` int(11) unsigned DEFAULT NULL,
|
||||||
|
`count` int(11) unsigned NOT NULL DEFAULT '0',
|
||||||
`last_check` timestamp NULL DEFAULT NULL,
|
`last_check` timestamp NULL DEFAULT NULL,
|
||||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
|
|
10
setup/sql/upgrade-00016.sql
Normal file
10
setup/sql/upgrade-00016.sql
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Header section
|
||||||
|
# Define incrementing schema version number
|
||||||
|
SET @schema_version = '16';
|
||||||
|
|
||||||
|
ALTER TABLE `triggers` ADD COLUMN `count` int(11) unsigned NOT NULL DEFAULT '0' AFTER `dest_campaign`;
|
||||||
|
|
||||||
|
# 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;
|
47
views/triggers/triggered.hbs
Normal file
47
views/triggers/triggered.hbs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li><a href="/">Home</a></li>
|
||||||
|
<li class="active">Automation Triggers</li>
|
||||||
|
<li class="active">Triggered {{name}}</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>Triggered subscribers</small></h2>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
{{#if description}}
|
||||||
|
<div class="well well-sm">{{{description}}}</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<div class="table-responsive">
|
||||||
|
|
||||||
|
<div class="panel panel-info">
|
||||||
|
<!-- Default panel contents -->
|
||||||
|
<div class="panel-heading">Subscribers who caused this trigger to fire:</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table data-topic-url="/triggers/status" data-topic-id="{{id}}" data-sort-column="4" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,1,0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-1">
|
||||||
|
#
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Address
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
First Name
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Last Name
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Triggered
|
||||||
|
</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -12,7 +12,7 @@
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="0,1,1,0,1,0,1,0">
|
<table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="0,1,1,0,1,0,1,1,0">
|
||||||
<thead>
|
<thead>
|
||||||
<th class="col-md-1">
|
<th class="col-md-1">
|
||||||
#
|
#
|
||||||
|
@ -35,6 +35,9 @@
|
||||||
<th>
|
<th>
|
||||||
Target Campaign
|
Target Campaign
|
||||||
</th>
|
</th>
|
||||||
|
<th>
|
||||||
|
Triggered
|
||||||
|
</th>
|
||||||
<th class="col-md-1">
|
<th class="col-md-1">
|
||||||
|
|
||||||
</th>
|
</th>
|
||||||
|
@ -69,6 +72,9 @@
|
||||||
<td class="text-info">
|
<td class="text-info">
|
||||||
<a href="/campaigns/view/{{destCampaign}}">{{destCampaignName}}</a>
|
<a href="/campaigns/view/{{destCampaign}}">{{destCampaignName}}</a>
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="/triggers/status/{{id}}">{{count}}</a>
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||||
<a href="/triggers/edit/{{id}}">
|
<a href="/triggers/edit/{{id}}">
|
||||||
|
|
Loading…
Reference in a new issue