Display a list of triggered users

This commit is contained in:
Andris Reinman 2016-06-24 14:12:21 +03:00
parent fe2a6651f1
commit eab46d758a
9 changed files with 189 additions and 6 deletions

View file

@ -172,7 +172,6 @@ module.exports.filter = (listId, request, columns, segmentId, callback) => {
};
module.exports.addConfirmation = (list, email, data, callback) => {
let cid = shortid.generate();

View file

@ -58,6 +58,7 @@ module.exports.list = callback => {
'`source`.`name` AS `source_campaign_name`',
'`dest`.`id` AS `dest_campaign`',
'`dest`.`name` AS `dest_campaign_name`',
'`triggers`.`count` AS `count`',
'`custom_fields`.`id` AS `column_id`',
'`triggers`.`column` AS `column`',
'`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) {
db.getConnection((err, connection) => {
if (err) {

View file

@ -1,3 +1,3 @@
{
"schemaVersion": 15
"schemaVersion": 16
}

View file

@ -9,6 +9,7 @@ let fields = require('../lib/models/fields');
let striptags = require('striptags');
let passport = require('../lib/passport');
let tools = require('../lib/tools');
let htmlescape = require('escape-html');
router.all('/*', (req, res, next) => {
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;

View file

@ -99,7 +99,10 @@ function fireTrigger(trigger, callback) {
connection.release();
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));
});
});
};

View file

@ -194,7 +194,7 @@ CREATE TABLE `settings` (
`value` text NOT NULL,
PRIMARY KEY (`id`),
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 (2,'smtp_port','465');
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 (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 (17,'db_schema_version','15');
INSERT INTO `settings` (`id`, `key`, `value`) VALUES (17,'db_schema_version','16');
CREATE TABLE `subscription` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cid` varchar(255) CHARACTER SET ascii NOT NULL,
@ -267,6 +267,7 @@ CREATE TABLE `triggers` (
`column` varchar(255) CHARACTER SET ascii DEFAULT NULL,
`seconds` int(11) NOT NULL DEFAULT '0',
`dest_campaign` int(11) unsigned DEFAULT NULL,
`count` int(11) unsigned NOT NULL DEFAULT '0',
`last_check` timestamp NULL DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),

View 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;

View 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>

View file

@ -12,7 +12,7 @@
<hr>
<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>
<th class="col-md-1">
#
@ -35,6 +35,9 @@
<th>
Target Campaign
</th>
<th>
Triggered
</th>
<th class="col-md-1">
&nbsp;
</th>
@ -69,6 +72,9 @@
<td class="text-info">
<a href="/campaigns/view/{{destCampaign}}">{{destCampaignName}}</a>
</td>
<td>
<a href="/triggers/status/{{id}}">{{count}}</a>
</td>
<td>
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
<a href="/triggers/edit/{{id}}">