ghost
Version:
The professional publishing platform
67 lines (58 loc) • 2.31 kB
JavaScript
class EventProcessingResult {
/**
* @param {object} result
* @param {number} [result.delivered]
* @param {number} [result.opened]
* @param {number} [result.temporaryFailed]
* @param {number} [result.permanentFailed]
* @param {number} [result.unsubscribed]
* @param {number} [result.complained]
* @param {number} [result.unhandled]
* @param {number} [result.unprocessable]
* @param {number} [result.processingFailures]
* @param {string[]} [result.emailIds]
* @param {string[]} [result.memberIds]
*/
constructor(result = {}) {
// counts
this.delivered = 0;
this.opened = 0;
this.temporaryFailed = 0;
this.permanentFailed = 0;
this.unsubscribed = 0;
this.complained = 0;
this.unhandled = 0;
this.unprocessable = 0;
// processing failures are counted separately in addition to event type counts
this.processingFailures = 0;
// ids seen whilst processing ready for passing to the stats aggregator
this.emailIds = [];
this.memberIds = [];
this.merge(result);
}
get totalEvents() {
return this.delivered
+ this.opened
+ this.temporaryFailed
+ this.permanentFailed
+ this.unsubscribed
+ this.complained
+ this.unhandled
+ this.unprocessable;
}
merge(other = {}) {
this.delivered += other.delivered || 0;
this.opened += other.opened || 0;
this.temporaryFailed += other.temporaryFailed || 0;
this.permanentFailed += other.permanentFailed || 0;
this.unsubscribed += other.unsubscribed || 0;
this.complained += other.complained || 0;
this.unhandled += other.unhandled || 0;
this.unprocessable += other.unprocessable || 0;
this.processingFailures += other.processingFailures || 0;
// TODO: come up with a cleaner way to merge these without churning through Array and Set
this.emailIds = Array.from(new Set([...this.emailIds, ...(other.emailIds || [])])).filter(Boolean);
this.memberIds = Array.from(new Set([...this.memberIds, ...(other.memberIds || [])])).filter(Boolean);
}
}
module.exports = EventProcessingResult;