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);
}
},
};