sources/new-campaign/new-campaign.mjs
import common from "../common/timer-based.mjs"; import constants from "../constants.mjs"; export default { ...common, key: "mailchimp-new-campaign", name: "New Campaign", description: "Emit new event when a new campaign is created or sent", version: "0.0.2", type: "source", dedupe: "unique", props: { ...common.props, type: { type: "string", label: "type", description: "There are four types of campaigns you can create in Mailchimp. A/B Split campaigns have been deprecated and variate campaigns should be used instead. ", options: constants.CAMPAIGN_TYPES, optional: false, }, status: { type: "string", label: "status", description: "Campaign status to watch for.", options: constants.CAMPAIGN_STATUSES, default: "created", }, }, hooks: { async deploy() { const config = { count: 10, offset: 0, }; const campaigns = this.mailchimp.statusIsSent(this.status) ? await this.mailchimp.getCampaignsBySentDate(config) : await this.mailchimp.getCampaignsByCreationDate(config); const sinceDate = campaigns?.length ? this.mailchimp.getCampaignTimestamp(campaigns[0], this.status) : Date.now(); if (campaigns?.length) { campaigns.status = this.status; campaigns.forEach(this.processEvent); } this.setDbServiceVariable("lastSinceDate", sinceDate); }, }, methods: { ...common.methods, generateMeta(eventPayload) { const eventDatedAt = this.mailchimp.getCampaignTimestamp(eventPayload, this.status); const ts = Date.parse(eventDatedAt); return { id: eventPayload.id, summary: `Campaign "${eventPayload.settings.title}" was ${this.status}.`, ts, }; }, }, async run() { const beforeDate = (new Date).toISOString(); const pageSize = constants.PAGE_SIZE; let sinceDate = this.getDbServiceVariable("lastSinceDate"); let campaigns; let offset = 0; const config = { count: pageSize, offset, status: this.status, beforeDate, }; do { config.sinceDate = sinceDate; config.offset = offset; campaigns = this.mailchimp.statusIsSent(this.status) ? await this.mailchimp.getCampaignsBySentDate(config) : await this.mailchimp.getCampaignsByCreationDate(config); if (!campaigns?.length) { throw new Error("No campaign data available"); } sinceDate = this.mailchimp.getCampaignTimestamp(campaigns[0], this.status); campaigns.forEach(this.processEvent); this.setDbServiceVariable("lastSinceDate", sinceDate); offset = offset + campaigns.length; } while (campaigns.length === pageSize); }, };