From fc6822a298e2aa711be1e9548096b2140ab8194f Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:43:14 +0100 Subject: [PATCH] feat(salesforce): add updated field in objects trigger --- packages/backend/src/apps/salesforce/index.ts | 2 + .../src/apps/salesforce/triggers/index.ts | 5 ++ .../updated-field-in-objects/index.ts | 55 +++++++++++++++++++ .../updated-field-in-objects.ts | 45 +++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 packages/backend/src/apps/salesforce/triggers/index.ts create mode 100644 packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/index.ts create mode 100644 packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/updated-field-in-objects.ts diff --git a/packages/backend/src/apps/salesforce/index.ts b/packages/backend/src/apps/salesforce/index.ts index 2f259c29..079f743e 100644 --- a/packages/backend/src/apps/salesforce/index.ts +++ b/packages/backend/src/apps/salesforce/index.ts @@ -1,6 +1,7 @@ import defineApp from '../../helpers/define-app'; import addAuthHeader from './common/add-auth-header'; import auth from './auth'; +import triggers from './triggers'; import data from './data'; export default defineApp({ @@ -14,5 +15,6 @@ export default defineApp({ primaryColor: '00A1E0', beforeRequest: [addAuthHeader], auth, + triggers, data, }); diff --git a/packages/backend/src/apps/salesforce/triggers/index.ts b/packages/backend/src/apps/salesforce/triggers/index.ts new file mode 100644 index 00000000..eeb8681d --- /dev/null +++ b/packages/backend/src/apps/salesforce/triggers/index.ts @@ -0,0 +1,5 @@ +import updatedFieldInObjects from "./updated-field-in-objects"; + +export default [ + updatedFieldInObjects +]; diff --git a/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/index.ts b/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/index.ts new file mode 100644 index 00000000..687c9246 --- /dev/null +++ b/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/index.ts @@ -0,0 +1,55 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import updatedFieldInObjects from './updated-field-in-objects'; + +export default defineTrigger({ + name: 'Updated field in objects', + key: 'updatedFieldInObjects', + pollInterval: 15, + description: 'Triggers when a field is updated in an object.', + arguments: [ + { + label: 'Object', + key: 'object', + type: 'dropdown' as const, + required: false, + variables: false, + source: { + type: 'query', + name: 'getData', + arguments: [ + { + name: 'key', + value: 'listObjects', + }, + ], + }, + }, + { + label: 'Field', + key: 'field', + type: 'dropdown' as const, + description: 'Track updates by this field', + required: true, + variables: false, + dependsOn: ['parameters.object'], + source: { + type: 'query', + name: 'getData', + arguments: [ + { + name: 'key', + value: 'listFields', + }, + { + name: 'parameters.object', + value: '{parameters.object}', + }, + ], + }, + }, + ], + + async run($) { + await updatedFieldInObjects($); + }, +}); diff --git a/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/updated-field-in-objects.ts b/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/updated-field-in-objects.ts new file mode 100644 index 00000000..d7f1d97c --- /dev/null +++ b/packages/backend/src/apps/salesforce/triggers/updated-field-in-objects/updated-field-in-objects.ts @@ -0,0 +1,45 @@ +import { IGlobalVariable } from '@automatisch/types'; + +function getQuery(object: string, limit: number, offset: number) { + return ` + SELECT + FIELDS(ALL) + FROM + ${object} + ORDER BY LastModifiedDate DESC + LIMIT ${limit} + OFFSET ${offset} + `; +} + +const updatedFieldInObjects = async ($: IGlobalVariable): Promise => { + const limit = 200; + const field = $.step.parameters.field as string; + const object = $.step.parameters.object as string; + + let response; + let offset = 0; + do { + const options = { + params: { + q: getQuery(object, limit, offset), + } + }; + + response = await $.http.get('/services/data/v56.0/query', options); + const records = response.data.records; + + for (const record of records) { + $.pushTriggerItem({ + raw: record, + meta: { + internalId: `${record.Id}-${record[field]}`, + } + }); + } + + offset = offset + limit; + } while (response.data.records?.length === limit); +}; + +export default updatedFieldInObjects;