From 67ee7899fd31b09eeca441e4f36a8e72c54bd386 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Wed, 19 Jun 2024 12:42:25 +0000 Subject: [PATCH 1/2] feat(salesforce): add find partially matching record action --- .../find-partially-matching-record/index.js | 81 +++++++++++++++++++ .../src/apps/salesforce/actions/index.js | 3 +- .../docs/pages/apps/salesforce/actions.md | 2 + 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js diff --git a/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js b/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js new file mode 100644 index 00000000..6a582dcb --- /dev/null +++ b/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js @@ -0,0 +1,81 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Find partially matching record', + key: 'findPartiallyMatchingRecord', + description: 'Finds a record of a specified object by a field containing a value.', + arguments: [ + { + label: 'Object', + key: 'object', + type: 'dropdown', + required: true, + variables: true, + description: 'Pick which type of object you want to search for.', + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listObjects', + }, + ], + }, + }, + { + label: 'Field', + key: 'field', + type: 'dropdown', + description: 'Pick which field to search by', + required: true, + variables: true, + dependsOn: ['parameters.object'], + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listFields', + }, + { + name: 'parameters.object', + value: '{parameters.object}', + }, + ], + }, + }, + { + label: 'Search value to contain', + key: 'searchValue', + type: 'string', + required: true, + variables: true, + description: 'The value to search for in the field.', + }, + ], + + async run($) { + const query = ` + SELECT + FIELDS(ALL) + FROM + ${$.step.parameters.object} + WHERE + ${$.step.parameters.field} LIKE '%${$.step.parameters.searchValue}%' + LIMIT 1 + `; + + const options = { + params: { + q: query, + }, + }; + + const { data } = await $.http.get('/services/data/v61.0/query', options); + const record = data.records[0]; + + $.setActionItem({ raw: record }); + }, +}); diff --git a/packages/backend/src/apps/salesforce/actions/index.js b/packages/backend/src/apps/salesforce/actions/index.js index b4de1984..89e3e3d3 100644 --- a/packages/backend/src/apps/salesforce/actions/index.js +++ b/packages/backend/src/apps/salesforce/actions/index.js @@ -1,5 +1,6 @@ import createAttachment from './create-attachment/index.js'; import executeQuery from './execute-query/index.js'; import findRecord from './find-record/index.js'; +import findPartiallyMatchingRecord from './find-partially-matching-record/index.js'; -export default [findRecord, createAttachment, executeQuery]; +export default [findRecord, findPartiallyMatchingRecord, createAttachment, executeQuery]; diff --git a/packages/docs/pages/apps/salesforce/actions.md b/packages/docs/pages/apps/salesforce/actions.md index 106ca5fb..1c22193f 100644 --- a/packages/docs/pages/apps/salesforce/actions.md +++ b/packages/docs/pages/apps/salesforce/actions.md @@ -5,6 +5,8 @@ items: desc: Creates an attachment of a specified object by given parent ID. - name: Find record desc: Finds a record of a specified object by a field and value. + - name: Find partially matching record + desc: Finds a record of a specified object by a field containing a value. - name: Execute query desc: Executes a SOQL query in Salesforce. --- From 92ec3d07a3dca6c4163d77a095e87cdced0114c5 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 21 Jun 2024 09:45:29 +0000 Subject: [PATCH 2/2] feat(salesforce/find-partially-matching-record): sanitize user inputs --- .../find-partially-matching-record/index.js | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js b/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js index 6a582dcb..328c57c0 100644 --- a/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js +++ b/packages/backend/src/apps/salesforce/actions/find-partially-matching-record/index.js @@ -1,4 +1,6 @@ import defineAction from '../../../../helpers/define-action.js'; +import listObjects from '../../dynamic-data/list-objects/index.js'; +import listFields from '../../dynamic-data/list-fields/index.js'; export default defineAction({ name: 'Find partially matching record', @@ -57,13 +59,31 @@ export default defineAction({ ], async run($) { + const sanitizedSearchValue = $.step.parameters.searchValue.replaceAll(`'`, `\\'`); + + // validate given object + const objects = await listObjects.run($); + const validObject = objects.data.find((object) => object.value === $.step.parameters.object); + + if (!validObject) { + throw new Error(`The "${$.step.parameters.object}" object does not exist.`); + } + + // validate given object field + const fields = await listFields.run($); + const validField = fields.data.find((field) => field.value === $.step.parameters.field); + + if (!validField) { + throw new Error(`The "${$.step.parameters.field}" field does not exist on the "${$.step.parameters.object}" object.`); + } + const query = ` SELECT FIELDS(ALL) FROM ${$.step.parameters.object} WHERE - ${$.step.parameters.field} LIKE '%${$.step.parameters.searchValue}%' + ${$.step.parameters.field} LIKE '%${sanitizedSearchValue}%' LIMIT 1 `;