sources/new-open/new-open.mjs
import common from "../common/timer-based.mjs"; export default { ...common, key: "mailchimp-new-open", name: "New Open", description: "Emit new event when a recipient opens an email in a specific campaign.", version: "0.0.2", type: "source", dedupe: "unique", props: { ...common.props, campaignId: { propDefinition: [ common.props.mailchimp, "campaignId", ], description: "The unique ID of the campaign you'd like to watch for new email opens on links.", }, uniqueOpensOnly: { type: "boolean", label: "Unique Opens Only?", description: "Whether to count every open campaign email or only count opens coming from each subscriber only once", default: false, }, }, hooks: { async deploy() { return this.emitReportSampleEvents(this.campaignId, undefined, (Date.now())); }, }, methods: { ...common.methods, getEventTypes() { return [ "opens", ]; }, generateMeta({ eventPayload, diff: openDiff, timestamp: ts, }) { const { campaign_id: campaignId } = eventPayload; return { id: `${campaignId}-${ts}`, summary: `${openDiff} new opens`, ts, }; }, getCachedCampaignDetails() { return { total_opens: this.getDbServiceVariable("total_opens"), members: this.getDbServiceVariable("members"), }; }, async getCampaignDetails() { return this.mailchimp.listCampaignOpenDetails( this.campaignId, ); }, getNodataErrorMessage() { return "No campaign found."; }, getCurrentCampaignDetails(campaignOpenReport) { return { total_opens: campaignOpenReport.total_opens, members: campaignOpenReport.members, }; }, getDetailsDiff(currentCampaignOpenReport, cachedCampaignOpenReport) { if (this.uniqueOpensOnly) { return (currentCampaignOpenReport.members.length | 0) - (cachedCampaignOpenReport.members.length | 0); } return currentCampaignOpenReport.total_opens - cachedCampaignOpenReport.total_opens; }, cacheCampaignDetails(currentCampaignOpenReport) { this.setDbServiceVariable("total_opens", currentCampaignOpenReport.total_opens); this.setDbServiceVariable("members", { members: currentCampaignOpenReport.members, }); }, clearCampaignDetailsCache() { this.setDbServiceVariable("total_opens", 0); this.setDbServiceVariable("members", { members: [], }); }, }, async run() { return this.emitReportEvents(); }, };