From 3d9249192c956109fe225a026ea563a58e69f97e Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:40:46 +0100 Subject: [PATCH 1/6] feat(salesforce): add list objects data --- .../backend/src/apps/salesforce/data/index.ts | 5 ++++ .../salesforce/data/list-objects/index.ts | 28 +++++++++++++++++++ packages/backend/src/apps/salesforce/index.ts | 2 ++ 3 files changed, 35 insertions(+) create mode 100644 packages/backend/src/apps/salesforce/data/index.ts create mode 100644 packages/backend/src/apps/salesforce/data/list-objects/index.ts diff --git a/packages/backend/src/apps/salesforce/data/index.ts b/packages/backend/src/apps/salesforce/data/index.ts new file mode 100644 index 00000000..7e2630e4 --- /dev/null +++ b/packages/backend/src/apps/salesforce/data/index.ts @@ -0,0 +1,5 @@ +import listObjects from './list-objects'; + +export default [ + listObjects, +]; diff --git a/packages/backend/src/apps/salesforce/data/list-objects/index.ts b/packages/backend/src/apps/salesforce/data/list-objects/index.ts new file mode 100644 index 00000000..143dab0f --- /dev/null +++ b/packages/backend/src/apps/salesforce/data/list-objects/index.ts @@ -0,0 +1,28 @@ +import { IGlobalVariable } from '@automatisch/types'; + +type TResponse = { + sobjects: TObject[]; +} + +type TObject = { + name: string; + label: string; +} + +export default { + name: 'List objects', + key: 'listObjects', + + async run($: IGlobalVariable) { + const response = await $.http.get('/services/data/v56.0/sobjects'); + + const objects = response.data.sobjects.map((object) => { + return { + value: object.name, + name: object.label, + }; + }); + + return { data: objects }; + }, +}; diff --git a/packages/backend/src/apps/salesforce/index.ts b/packages/backend/src/apps/salesforce/index.ts index 2a89e164..2f259c29 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 data from './data'; export default defineApp({ name: 'Salesforce', @@ -13,4 +14,5 @@ export default defineApp({ primaryColor: '00A1E0', beforeRequest: [addAuthHeader], auth, + data, }); From 927ceb67684ba04e3a558c6dbd0fe9c7ae8eb869 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:41:12 +0100 Subject: [PATCH 2/6] feat(salesforce): add list fields data --- .../backend/src/apps/salesforce/data/index.ts | 2 ++ .../apps/salesforce/data/list-fields/index.ts | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 packages/backend/src/apps/salesforce/data/list-fields/index.ts diff --git a/packages/backend/src/apps/salesforce/data/index.ts b/packages/backend/src/apps/salesforce/data/index.ts index 7e2630e4..018c88f6 100644 --- a/packages/backend/src/apps/salesforce/data/index.ts +++ b/packages/backend/src/apps/salesforce/data/index.ts @@ -1,5 +1,7 @@ import listObjects from './list-objects'; +import listFields from './list-fields'; export default [ listObjects, + listFields, ]; diff --git a/packages/backend/src/apps/salesforce/data/list-fields/index.ts b/packages/backend/src/apps/salesforce/data/list-fields/index.ts new file mode 100644 index 00000000..78238500 --- /dev/null +++ b/packages/backend/src/apps/salesforce/data/list-fields/index.ts @@ -0,0 +1,29 @@ +import { IGlobalVariable } from '@automatisch/types'; + +type TResponse = { + fields: TField[]; +} + +type TField = { + name: string; + label: string; +} + +export default { + name: 'List fields', + key: 'listFields', + + async run($: IGlobalVariable) { + const { object } = $.step.parameters; + const response = await $.http.get(`/services/data/v56.0/sobjects/${object}/describe`); + + const fields = response.data.fields.map((field) => { + return { + value: field.name, + name: field.label, + }; + }); + + return { data: fields }; + }, +}; From f11a4b84724afa181e01b0b7fd46b84cb520a0e0 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:41:55 +0100 Subject: [PATCH 3/6] fix(TestSubstep): don't show length of empty errors --- packages/web/src/components/TestSubstep/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/components/TestSubstep/index.tsx b/packages/web/src/components/TestSubstep/index.tsx index d4d46920..4169d668 100644 --- a/packages/web/src/components/TestSubstep/index.tsx +++ b/packages/web/src/components/TestSubstep/index.tsx @@ -93,7 +93,7 @@ function TestSubstep(props: TestSubstepProps): React.ReactElement { /> - {error?.graphQLErrors?.length && + {!!error?.graphQLErrors?.length && {serializeErrors(error.graphQLErrors).map((error: any) => (
{error.message}
))}
} From 43b7e506a7592c192d22842b3c257446853ce76e Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:42:46 +0100 Subject: [PATCH 4/6] fix(web): add missing options in GetApps query --- packages/web/src/graphql/queries/get-apps.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/web/src/graphql/queries/get-apps.ts b/packages/web/src/graphql/queries/get-apps.ts index 59cf4c79..2995dcfc 100644 --- a/packages/web/src/graphql/queries/get-apps.ts +++ b/packages/web/src/graphql/queries/get-apps.ts @@ -22,6 +22,10 @@ export const GET_APPS = gql` description docUrl clickToCopy + options { + label + value + } } authenticationSteps { type From fc6822a298e2aa711be1e9548096b2140ab8194f Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 5 Nov 2022 02:43:14 +0100 Subject: [PATCH 5/6] 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; From cbd408ae89c43c50821523bf13cff8fd54f5ba48 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 5 Nov 2022 14:53:38 +0100 Subject: [PATCH 6/6] fix(salesforce): Implement guard for list objects --- .../src/apps/salesforce/data/list-fields/index.ts | 11 ++++++++--- .../triggers/updated-field-in-objects/index.ts | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/apps/salesforce/data/list-fields/index.ts b/packages/backend/src/apps/salesforce/data/list-fields/index.ts index 78238500..00a61889 100644 --- a/packages/backend/src/apps/salesforce/data/list-fields/index.ts +++ b/packages/backend/src/apps/salesforce/data/list-fields/index.ts @@ -2,12 +2,12 @@ import { IGlobalVariable } from '@automatisch/types'; type TResponse = { fields: TField[]; -} +}; type TField = { name: string; label: string; -} +}; export default { name: 'List fields', @@ -15,7 +15,12 @@ export default { async run($: IGlobalVariable) { const { object } = $.step.parameters; - const response = await $.http.get(`/services/data/v56.0/sobjects/${object}/describe`); + + if (!object) return { data: [] }; + + const response = await $.http.get( + `/services/data/v56.0/sobjects/${object}/describe` + ); const fields = response.data.fields.map((field) => { return { 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 index 687c9246..96c0e0a4 100644 --- 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 @@ -11,7 +11,7 @@ export default defineTrigger({ label: 'Object', key: 'object', type: 'dropdown' as const, - required: false, + required: true, variables: false, source: { type: 'query',