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