diff --git a/core/server/services/email-analytics/email-analytics.js b/core/server/services/email-analytics/email-analytics.js index 5fed5351d1..666f3d122c 100644 --- a/core/server/services/email-analytics/email-analytics.js +++ b/core/server/services/email-analytics/email-analytics.js @@ -81,7 +81,7 @@ class EmailAnalyticsService { await this.aggregateEmailStats(emailId); } for (const memberId of memberIds) { - await this.aggregateEmailStats(memberId); + await this.aggregateMemberStats(memberId); } } diff --git a/core/server/services/email-analytics/jobs/fetch-all.js b/core/server/services/email-analytics/jobs/fetch-all.js index 6ad4dde640..55e6959757 100644 --- a/core/server/services/email-analytics/jobs/fetch-all.js +++ b/core/server/services/email-analytics/jobs/fetch-all.js @@ -50,7 +50,7 @@ if (parentPort) { 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`); + logging.info(`Fetched ${eventStats.totalEvents} events and aggregated stats for ${eventStats.emailIds.length} emails and ${eventStats.memberIds.length} members in ${aggregateEndDate - fetchStartDate}ms`); if (parentPort) { parentPort.postMessage('done'); diff --git a/core/server/services/email-analytics/jobs/fetch-latest.js b/core/server/services/email-analytics/jobs/fetch-latest.js index 1216197910..13642eef64 100644 --- a/core/server/services/email-analytics/jobs/fetch-latest.js +++ b/core/server/services/email-analytics/jobs/fetch-latest.js @@ -51,7 +51,7 @@ if (parentPort) { 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`); + logging.info(`Fetched ${eventStats.totalEvents} events and aggregated stats for ${eventStats.emailIds.length} emails and ${eventStats.memberIds.length} members in ${aggregateEndDate - fetchStartDate}ms`); if (parentPort) { parentPort.postMessage('done'); diff --git a/core/server/services/email-analytics/lib/stats-aggregator.js b/core/server/services/email-analytics/lib/stats-aggregator.js index 4a0d4355f7..46dd62b518 100644 --- a/core/server/services/email-analytics/lib/stats-aggregator.js +++ b/core/server/services/email-analytics/lib/stats-aggregator.js @@ -1,5 +1,6 @@ class EmailAnalyticsStatsAggregator { - constructor({logging, db}) { + constructor({options, logging, db}) { + this.options = Object.assign({openRateEmailThreshold: 5}, options); this.logging = logging || console; this.db = db; } @@ -12,8 +13,23 @@ class EmailAnalyticsStatsAggregator { }).where('id', emailId); } - async aggregateMember(/*memberId*/) { - // TODO: decide on aggregation algorithm when only certain emails have open tracking + async aggregateMember(memberId) { + const {trackedEmailCount} = await this.db.knex('email_recipients') + .select(this.db.knex.raw('COUNT(email_recipients.id) as trackedEmailCount')) + .leftJoin('emails', 'email_recipients.email_id', 'emails.id') + .where('email_recipients.member_id', memberId) + .where('emails.track_opens', true) + .first() || {}; + + if (trackedEmailCount >= this.options.openRateEmailThreshold) { + await this.db.knex('members') + .update({ + email_open_rate: this.db.knex.raw(`( + (SELECT COUNT(id) FROM email_recipients WHERE member_id = ? AND opened_at IS NOT NULL) * 1.0 / ? * 100) + `, [memberId, trackedEmailCount]) + }) + .where('id', memberId); + } } }