2020-11-26 16:09:38 +03:00
const logging = require ( '../../../../shared/logging' ) ;
2020-11-26 18:12:12 +03:00
const { parentPort } = require ( 'bthreads' ) ;
2020-11-26 16:09:38 +03:00
const debug = require ( 'ghost-ignition' ) . debug ( 'jobs:email-analytics:fetch-all' ) ;
// one-off job to fetch all available events and re-process them idempotently
// NB. can be a _very_ long job for sites with many members and frequent emails
function cancel ( ) {
logging . info ( 'Email analytics fetch-all job cancelled before completion' ) ;
if ( parentPort ) {
parentPort . postMessage ( 'cancelled' ) ;
} else {
setTimeout ( ( ) => {
process . exit ( 0 ) ;
} , 1000 ) ;
}
}
if ( parentPort ) {
parentPort . once ( 'message' , ( message ) => {
if ( message === 'cancel' ) {
return cancel ( ) ;
}
} ) ;
}
( async ( ) => {
try {
const models = require ( '../../../models' ) ;
const settingsService = require ( '../../settings' ) ;
// must be initialized before emailAnalyticsService is required otherwise
// requires are in the wrong order and settingsCache will always be empty
await models . init ( ) ;
await settingsService . init ( ) ;
const emailAnalyticsService = require ( '../' ) ;
const fetchStartDate = new Date ( ) ;
debug ( 'Starting email analytics fetch of all available events' ) ;
const eventStats = await emailAnalyticsService . fetchAll ( ) ;
const fetchEndDate = new Date ( ) ;
debug ( ` Finished fetching ${ eventStats . totalEvents } analytics events in ${ fetchEndDate - fetchStartDate } ms ` ) ;
const aggregateStartDate = new Date ( ) ;
debug ( ` Starting email analytics aggregation for ${ eventStats . emailIds . length } emails ` ) ;
await emailAnalyticsService . aggregateStats ( eventStats ) ;
const aggregateEndDate = new Date ( ) ;
debug ( ` Finished aggregating email analytics in ${ aggregateEndDate - aggregateStartDate } ms ` ) ;
logging . info ( ` Fetched ${ eventStats . totalEvents } events and aggregated stats for ${ eventStats . emailIds . length } emails in ${ aggregateEndDate - fetchStartDate } ms ` ) ;
if ( parentPort ) {
parentPort . postMessage ( 'done' ) ;
} else {
// give the logging pipes time finish writing before exit
setTimeout ( ( ) => {
process . exit ( 0 ) ;
} , 1000 ) ;
}
} catch ( error ) {
logging . error ( error ) ;
// give the logging pipes time finish writing before exit
setTimeout ( ( ) => {
process . exit ( 1 ) ;
} , 1000 ) ;
}
} ) ( ) ;