Separate disable opened/clicked tracker to 2 options

This commit is contained in:
vladimir 2017-05-27 14:04:49 +02:00
parent 5c0aab1c3e
commit 59912e3c29
13 changed files with 134 additions and 60 deletions

View file

@ -16,7 +16,7 @@ let _ = require('../translate')._;
let util = require('util');
let tableHelpers = require('../table-helpers');
let allowedKeys = ['description', 'from', 'address', 'reply_to', 'subject', 'editor_name', 'editor_data', 'template', 'source_url', 'list', 'segment', 'html', 'text', 'tracking_disabled'];
let allowedKeys = ['description', 'from', 'address', 'reply_to', 'subject', 'editor_name', 'editor_data', 'template', 'source_url', 'list', 'segment', 'html', 'text', 'click_tracking_disabled', 'open_tracking_disabled'];
module.exports.list = (start, limit, callback) => {
tableHelpers.list('campaigns', ['*'], 'scheduled', null, start, limit, callback);
@ -370,7 +370,8 @@ module.exports.create = (campaign, opts, callback) => {
campaign = tools.convertKeys(campaign);
let name = (campaign.name || '').toString().trim();
campaign.trackingDisabled = campaign.trackingDisabled ? 1 : 0;
campaign.openTrackingDisabled = campaign.openTrackingDisabled ? 1 : 0;
campaign.clickTrackingDisabled = campaign.clickTrackingDisabled ? 1 : 0;
opts = opts || {};
@ -592,7 +593,8 @@ module.exports.update = (id, updates, callback) => {
let campaign = tools.convertKeys(updates);
let name = (campaign.name || '').toString().trim();
campaign.trackingDisabled = campaign.trackingDisabled ? 1 : 0;
campaign.openTrackingDisabled = campaign.openTrackingDisabled ? 1 : 0;
campaign.clickTrackingDisabled = campaign.clickTrackingDisabled ? 1 : 0;
if (!name) {
return callback(new Error(_('Campaign Name must be set')));

View file

@ -42,7 +42,7 @@ module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscrip
return callback(err);
}
if (!data || data.campaign.trackingDisabled) {
if (!data || data.campaign.clickTrackingDisabled) {
return callback(null, false);
}
@ -158,7 +158,7 @@ module.exports.countOpen = (remoteIp, useragent, campaignCid, listCid, subscript
return callback(err);
}
if (!data || data.campaign.trackingDisabled) {
if (!data || data.campaign.openTrackingDisabled) {
return callback(null, false);
}
@ -268,56 +268,64 @@ module.exports.add = (url, campaignId, callback) => {
};
module.exports.updateLinks = (campaign, list, subscription, serviceUrl, message, callback) => {
if (campaign.trackingDisabled || !message || !message.trim()) {
if ((campaign.openTrackingDisabled && campaign.clickTrackingDisabled) || !message || !message.trim()) {
// tracking is disabled, do not modify the message
return setImmediate(() => callback(null, message));
}
let re = /(<a[^>]* href\s*=[\s"']*)(http[^"'>\s]+)/gi;
let urls = new Set();
(message || '').replace(re, (match, prefix, url) => {
urls.add(url);
});
let map = new Map();
let vals = urls.values();
// insert tracking image
let inserted = false;
let imgUrl = urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid)));
let img = '<img src="' + imgUrl + '" width="1" height="1" alt="mt">';
message = message.replace(/<\/body\b/i, match => {
inserted = true;
return img + match;
});
if (!inserted) {
message = message + img;
}
let replaceUrls = () => {
callback(null,
message.replace(re, (match, prefix, url) =>
prefix + (map.has(url) ? urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid), encodeURIComponent(map.get(url)))) : url)));
};
let storeNext = () => {
let urlItem = vals.next();
if (urlItem.done) {
return replaceUrls();
}
module.exports.add(he.decode(urlItem.value, {
isAttributeValue: true
}), campaign.id, (err, linkId, cid) => {
if (err) {
log.error('Link', err);
return storeNext();
}
map.set(urlItem.value, cid);
return storeNext();
if (!campaign.openTrackingDisabled) {
let inserted = false;
let imgUrl = urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid)));
let img = '<img src="' + imgUrl + '" width="1" height="1" alt="mt">';
message = message.replace(/<\/body\b/i, match => {
inserted = true;
return img + match;
});
if (!inserted) {
message = message + img;
}
if (campaign.clickTrackingDisabled) {
return callback(null, message);
}
}
if (!campaign.clickTrackingDisabled) {
let re = /(<a[^>]* href\s*=[\s"']*)(http[^"'>\s]+)/gi;
let urls = new Set();
(message || '').replace(re, (match, prefix, url) => {
urls.add(url);
});
};
storeNext();
let map = new Map();
let vals = urls.values();
let replaceUrls = () => {
callback(null,
message.replace(re, (match, prefix, url) =>
prefix + (map.has(url) ? urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid), encodeURIComponent(map.get(url)))) : url)));
};
let storeNext = () => {
let urlItem = vals.next();
if (urlItem.done) {
return replaceUrls();
}
module.exports.add(he.decode(urlItem.value, {
isAttributeValue: true
}), campaign.id, (err, linkId, cid) => {
if (err) {
log.error('Link', err);
return storeNext();
}
map.set(urlItem.value, cid);
return storeNext();
});
};
storeNext();
}
};
function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {