sources/new-deal-property-change/new-deal-property-change.mjs
import { DEFAULT_LIMIT } from "../../common/constants.mjs"; import common from "../common/common.mjs"; import sampleEmit from "./test-event.mjs"; export default { ...common, key: "hubspot-new-deal-property-change", name: "New Deal Property Change", description: "Emit new event when a specified property is provided or updated on a deal. [See the documentation](https://developers.hubspot.com/docs/api/crm/deals)", version: "0.0.31", dedupe: "unique", type: "source", props: { ...common.props, property: { type: "string", label: "Property", description: "The deal property to watch for changes", async options() { const properties = await this.hubspot.getDealProperties(); return properties.map((property) => property.name); }, }, }, methods: { ...common.methods, getTs(deal) { const history = deal.propertiesWithHistory[this.property]; if (!history || !(history.length > 0)) { return; } return Date.parse(history[0].timestamp); }, generateMeta(deal) { const { id } = deal; const ts = this.getTs(deal); return { id: `${id}${ts}`, summary: `Deal ${id} updated`, ts, }; }, isRelevant(deal, updatedAfter) { return this.getTs(deal) > updatedAfter; }, getParams(after) { const params = { object: "deals", data: { limit: DEFAULT_LIMIT, properties: [ this.property, ], sorts: [ { propertyName: "hs_lastmodifieddate", direction: "DESCENDING", }, ], filterGroups: [ { filters: [ { propertyName: this.property, operator: "HAS_PROPERTY", }, ], }, ], }, }; if (after) { params.data.filterGroups[0].filters.push({ propertyName: "hs_lastmodifieddate", operator: "GTE", value: after, }); } return params; }, batchGetDeals(inputs) { return this.hubspot.batchGetObjects({ objectType: "deals", data: { properties: [ this.property, ], propertiesWithHistory: [ this.property, ], inputs, }, }); }, async processResults(after, params) { const properties = await this.hubspot.getDealProperties(); const propertyNames = properties.map((property) => property.name); if (!propertyNames.includes(this.property)) { throw new Error( `Property "${this.property}" not supported for Deals. See Hubspot's default deal properties documentation - https://knowledge.hubspot.com/crm-deals/hubspots-default-deal-properties`, ); } const updatedDeals = await this.getPaginatedItems( this.hubspot.searchCRM, params, after, ); if (!updatedDeals.length) { return; } const results = await this.processChunks({ batchRequestFn: this.batchGetDeals, chunks: this.getChunks(updatedDeals), }); this.processEvents(results, after); }, }, sampleEmit, };