Fix - invalid campaign when one tried to unsubscribe from a test message before campaign was sent
65 lines
2.7 KiB
JavaScript
65 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
const passport = require('../lib/passport');
|
|
const shares = require('../models/shares');
|
|
const contextHelpers = require('../lib/context-helpers');
|
|
const {renderCsvFromStream} = require('../lib/report-helpers');
|
|
const reports = require('../models/reports');
|
|
const campaigns = require('../models/campaigns');
|
|
const {castToInteger} = require('../lib/helpers');
|
|
const {SubscriptionStatus} = require('../../shared/lists');
|
|
const knex = require('../lib/knex');
|
|
const {LinkId} = require('../models/links');
|
|
const moment = require('moment');
|
|
|
|
const router = require('../lib/router-async').create();
|
|
|
|
router.getAsync('/open-and-click-counts/:campaignId', passport.loggedIn, async (req, res) => {
|
|
const campaignId = castToInteger(req.params.campaignId);
|
|
|
|
await shares.enforceEntityPermission(req.context, 'campaign', campaignId, 'viewStats');
|
|
const campaign = await campaigns.getById(req.context, campaignId, false);
|
|
|
|
const listFields = await reports.getCampaignCommonListFields(campaign);
|
|
|
|
const results = await reports.getCampaignStatisticsStream(
|
|
campaign,
|
|
['subscription:email', 'open_tracker:count', 'click_tracker:count', 'open_tracker:country', 'open_tracker:created', 'open_tracker:deviceType', ...Object.keys(listFields)],
|
|
[
|
|
{type: 'links', prefix: 'open_tracker', onConditions: {link: knex.raw('?', [LinkId.OPEN])} },
|
|
{type: 'links', prefix: 'click_tracker', onConditions: {link: knex.raw('?', [LinkId.GENERAL_CLICK])} }
|
|
],
|
|
null,
|
|
(qry, col) => qry
|
|
.where(col('subscription:status'), SubscriptionStatus.SUBSCRIBED)
|
|
);
|
|
|
|
res.set({
|
|
'Content-Disposition': `attachment;filename=campaign-open-and-click-counts-${campaign.cid}.csv`,
|
|
'Content-Type': 'text/csv'
|
|
});
|
|
|
|
await renderCsvFromStream(
|
|
results,
|
|
res,
|
|
{
|
|
header: true,
|
|
columns: [
|
|
{ key: 'subscription:email', header: 'Email' },
|
|
{ key: 'open_tracker:count', header: 'Open count' },
|
|
{ key: 'click_tracker:count', header: 'Click count' },
|
|
{ key: 'open_tracker:country', header: 'Country (first open)' },
|
|
{ key: 'open_tracker:created', header: 'Date/time (first open)' },
|
|
{ key: 'open_tracker:deviceType', header: 'Device type (first open)' },
|
|
...Object.keys(listFields).map(key => ({key, header: listFields[key].key}))
|
|
],
|
|
delimiter: ','
|
|
},
|
|
async (row, encoding) => ({
|
|
...row,
|
|
'open_tracker:created': moment(row['open_tracker:created']).toISOString()
|
|
})
|
|
);
|
|
});
|
|
|
|
module.exports = router;
|