sources/link-clicked/link-clicked.mjs
import common from "../common/timer-based.mjs"; export default { ...common, key: "mailchimp-link-clicked", name: "Link Clicked", description: "Emit new event when a recipient clicks a pre-specified link in an 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 clicks on links", }, linkId: { propDefinition: [ common.props.mailchimp, "linkId", (c) => ({ campaignId: c.campaignId, }), ], }, uniqueClicksOnly: { type: "boolean", label: "Unique Clicks Only?", description: "Whether to count every link click or only count clicks coming from each user only once", default: false, }, }, hooks: { async deploy() { return this.emitReportSampleEvents(this.campaignId, this.linkId, (Date.now())); }, }, methods: { ...common.methods, getEventTypes() { return [ "clicks", ]; }, generateMeta({ eventPayload, diff: clickDiff, timestamp: ts, }) { const { id: linkId } = eventPayload; return { id: `${linkId}-${ts}`, summary: `${clickDiff} new clicks`, ts, }; }, getCachedCampaignDetails() { return this.getDbServiceVariable("recipientClicks"); }, async getCampaignDetails() { return this.mailchimp.getCampaignClickDetailsForLink( this.campaignId, this.linkId, ); }, getNodataErrorMessage() { return "No data found for specified campaign and link."; }, getCurrentCampaignDetails(report) { return this.uniqueClicksOnly ? report.unique_clicks : report.total_clicks; }, getDetailsDiff(currentRecipientClicks, recipientClicks) { return currentRecipientClicks - recipientClicks; }, cacheCampaignDetails(currentRecipientClicks) { if (isNaN(currentRecipientClicks)) { if (this.uniqueClicksOnly) { this.setDbServiceVariable("recipientClicks", currentRecipientClicks.unique_clicks); } else { this.setDbServiceVariable("recipientClicks", currentRecipientClicks.total_clicks); } } else { this.setDbServiceVariable("recipientClicks", currentRecipientClicks); } }, clearCampaignDetailsCache() { this.setDbServiceVariable("recipientClicks", 0); }, }, async run() { return this.emitReportEvents(); }, };