sources/new-or-updated-list-segment/new-or-updated-list-segment.mjs
import common from "../common/timer-based.mjs"; import constants from "../constants.mjs"; export default { ...common, key: "mailchimp-new-or-updated-list-segment", name: "New or Updated List Segment", description: "Emit new event when segment is either created or updated.", version: "0.0.2", type: "source", dedupe: "unique", props: { ...common.props, listId: { propDefinition: [ common.props.mailchimp, "listId", ], description: "The unique ID of the audience list which you'd like to watch for new or updated segments", }, watchFor: { type: "string", label: "Watch for new created or updated segments?", description: "If set to `Created`, it will include new created segments only. When set to `Updated`, it will only include recently updated segments.", options: constants.SEGMENT_WATCH_TYPES, optional: false, }, includeTransactional: { propDefinition: [ common.props.mailchimp, "includeTransactional", ], }, }, hooks: { async deploy() { const config = { count: 10, offset: 0, }; const segments = this.watchFor === "Created" ? await this.mailchimp.getAudienceSegmentsByCreatedDate(this.listId, config) : await this.mailchimp.getAudienceSegmentsByUpdatedDate(this.listId, config); if (!segments?.length) { throw new Error("No segment data available"); } const relevantDate = this.watchFor === "Created" ? segments[0].created_at : segments[0].updated_at; segments.forEach(this.processEvent); this.setDbServiceVariable("lastRelevantDate", relevantDate); }, }, methods: { ...common.methods, generateMeta(eventPayload) { if (this.watchFor === "Created") { return { id: eventPayload.id, summary: `A new segment "${eventPayload.name}" was created.`, ts: Date.parse(eventPayload.created_at), }; } else { const ts = Date.parse(eventPayload.updated_at); return { id: `${eventPayload.id}${ts}`, summary: `Segment "${eventPayload.name}" was updated.`, ts, }; } }, }, async run() { let startDateTime = this.getDbServiceVariable("lastRelevantDate"); const endDateTime = (new Date).toISOString(); let segments; let offset = 0; const pageSize = constants.PAGE_SIZE; const config = { count: pageSize, endDateTime, }; do { config.offset = offset; config.startDateTime = startDateTime; segments = this.watchFor === "Created" ? segments = await this.mailchimp.getAudienceSegmentsByCreatedDate(this.listId, config) : segments = await this.mailchimp.getAudienceSegmentsByUpdatedDate(this.listId, config); if (!segments?.length) { return; } segments.forEach(this.processEvent); startDateTime = this.watchFor === "Created" ? segments[0].created_at : segments[0].updated_at; this.setDbServiceVariable("lastRelevantDate", startDateTime); offset = offset + segments.length; } while (segments.length === pageSize); }, };