sources/new-order/new-order.mjs
import common from "../common/timer-based.mjs"; import constants from "../constants.mjs"; export default { ...common, key: "mailchimp-new-order", name: "New Order", description: "Emit new event when an order is added to your store, or Mailchimp account.", version: "0.0.2", type: "source", dedupe: "unique", props: { ...common.props, storeId: { propDefinition: [ common.props.mailchimp, "storeId", ], description: "The unique ID of the store you'd like to watch for new orders", }, campaignId: { propDefinition: [ common.props.mailchimp, "campaignId", ], description: "Watch only for new orders with a specific Campaign Id value.", }, customerId: { type: "string", label: "Customer Id", description: "Watch only for new orders made by a specific customer with this unique ID", optional: true, useQuery: true, async options({ page }) { const count = constants.PAGE_SIZE; const offset = count * page; const config = { count, offset, }; const customersResults = await this.mailchimp.getAllStoreCustomers(this.storeId, config); if (customersResults.customers) { return customersResults.customers.map((customer) => ({ label: `${customer.first_name} ${customer.last_name}`, value: customer.id, })); } else { return []; } }, }, hasOutreach: { type: "string", label: "Has Outreach?", description: "Watch only for new orders that have an outreach attached. For example, an email campaign or Facebook ad", options: constants.ORDER_HAS_OUTREACH_CHOICES, default: "Both", }, outreachId: { type: "string", label: "Outreach Id", description: "Ignored if `hasOutreach` is marked as 'No'", optional: true, useQuery: true, async options({ page }) { const count = constants.PAGE_SIZE; const offset = count * page; const config = { count, offset, }; const outreachResults = await this.mailchimp.getAllFacebookAds(config); return outreachResults.facebook_ads.map((outreach) => ({ label: outreach.name, value: outreach.id, })); }, }, }, hooks: { async deploy() { this._clearProcessedIds(); const processedIds = new Set(this._getProcessedIds()); const count = 10; const config = { count, offset: 0, campaignId: this.campaignId, outreachId: this.outreachId, customerId: this.customerId, hasOutreach: this.hasOutreach, }; const orderStream = this.mailchimp.getOrderStream(this.storeId, config); let i = 0; for await (const order of orderStream) { if (i < count) { this.processEvent(order); processedIds.add(order.id); this._setProcessedIds(processedIds); } i++; } }, }, methods: { ...common.methods, generateMeta(eventPayload) { const ts = Date.parse(eventPayload.created_at); return { id: eventPayload.id, summary: "A new order has been submitted.", ts, }; }, _clearProcessedIds() { return this.db.set("processedIds", []); }, _getProcessedIds() { return this.db.get("processedIds"); }, _setProcessedIds(processedIds) { this.db.set("processedIds", Array.from(processedIds)); }, }, async run() { const processedIds = new Set(this._getProcessedIds()); const config = { count: constants.PAGE_SIZE, offset: 0, }; const orderStream = this.mailchimp.getOrderStream(this.storeId, config); for await (const order of orderStream) { if (processedIds.has(order.id)) { continue; } this.processEvent(order); processedIds.add(order.id); this._setProcessedIds(processedIds); } }, };