@pipedream/salesforce_rest_api 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +92 -0
  2. package/actions/add-contact-to-campaign/add-contact-to-campaign.mjs +25 -25
  3. package/actions/add-lead-to-campaign/add-lead-to-campaign.mjs +25 -24
  4. package/actions/common/base-create-update.mjs +108 -0
  5. package/actions/convert-soap-xml-to-json/convert-soap-xml-to-json.mjs +11 -3
  6. package/actions/create-account/create-account.mjs +33 -36
  7. package/actions/create-attachment/create-attachment.mjs +36 -50
  8. package/actions/create-campaign/create-campaign.mjs +41 -37
  9. package/actions/create-case/create-case.mjs +41 -37
  10. package/actions/create-casecomment/create-casecomment.mjs +26 -38
  11. package/actions/create-contact/create-contact.mjs +38 -35
  12. package/actions/create-event/create-event.mjs +57 -66
  13. package/actions/create-lead/create-lead.mjs +34 -42
  14. package/actions/create-note/create-note.mjs +24 -43
  15. package/actions/create-opportunity/create-opportunity.mjs +38 -47
  16. package/actions/create-record/create-record.mjs +49 -15
  17. package/actions/create-task/create-task.mjs +50 -42
  18. package/actions/create-user/create-user.mjs +33 -196
  19. package/actions/delete-opportunity/delete-opportunity.mjs +17 -13
  20. package/actions/delete-record/delete-record.mjs +18 -16
  21. package/actions/find-records/find-records.mjs +41 -26
  22. package/actions/insert-blob-data/insert-blob-data.mjs +3 -7
  23. package/actions/post-feed-to-chatter/post-feed-to-chatter.mjs +45 -20
  24. package/actions/search-string/search-string.mjs +22 -20
  25. package/actions/soql-search/soql-search.mjs +13 -8
  26. package/actions/sosl-search/sosl-search.mjs +19 -9
  27. package/actions/update-account/update-account.mjs +54 -41
  28. package/actions/update-contact/update-contact.mjs +59 -40
  29. package/actions/update-opportunity/update-opportunity.mjs +56 -54
  30. package/actions/update-record/update-record.mjs +67 -20
  31. package/common/all-sobjects.mjs +3812 -0
  32. package/common/constants-props.mjs +1539 -0
  33. package/common/props-async-options.mjs +154 -0
  34. package/common/props-utils.mjs +88 -31
  35. package/common/sobjects/account.mjs +349 -22
  36. package/common/sobjects/attachment.mjs +56 -17
  37. package/common/sobjects/campaign.mjs +125 -23
  38. package/common/sobjects/case.mjs +193 -13
  39. package/common/sobjects/caseComment.mjs +28 -4
  40. package/common/sobjects/contact.mjs +207 -43
  41. package/common/sobjects/event.mjs +218 -18
  42. package/common/sobjects/lead.mjs +245 -22
  43. package/common/sobjects/note.mjs +37 -14
  44. package/common/sobjects/opportunity.mjs +148 -22
  45. package/common/sobjects/task.mjs +240 -19
  46. package/common/sobjects/user.mjs +965 -0
  47. package/package.json +2 -2
  48. package/salesforce_rest_api.app.mjs +72 -249
  49. package/sources/common-webhook-methods.mjs +71 -0
  50. package/sources/common.mjs +85 -22
  51. package/sources/new-outbound-message/new-outbound-message.mjs +11 -3
  52. package/sources/new-record-instant/new-record-instant.mjs +77 -6
  53. package/sources/record-deleted-instant/record-deleted-instant.mjs +40 -5
  54. package/sources/record-updated-instant/record-updated-instant.mjs +137 -5
  55. package/actions/common/base.mjs +0 -18
  56. package/actions/find-create-record/find-create-record.mjs +0 -89
  57. package/actions/get-sobject-fields-values/get-sobject-fields-values.mjs +0 -57
  58. package/common/utils.mjs +0 -51
  59. package/sources/common-instant.mjs +0 -146
  60. package/sources/new-record/new-record.mjs +0 -91
  61. package/sources/record-deleted/record-deleted.mjs +0 -51
  62. package/sources/record-updated/record-updated.mjs +0 -94
  63. package/sources/updated-field-on-record/updated-field-on-record.mjs +0 -161
  64. package/sources/updated-field-on-record-instant/updated-field-on-record-instant.mjs +0 -76
@@ -1,146 +0,0 @@
1
- import { v4 as uuidv4 } from "uuid";
2
- import salesforce from "../salesforce_rest_api.app.mjs";
3
- import salesforceWebhooks from "salesforce-webhooks";
4
-
5
- const { SalesforceClient } = salesforceWebhooks;
6
-
7
- export default {
8
- dedupe: "unique",
9
- props: {
10
- salesforce,
11
- db: "$.service.db",
12
- // eslint-disable-next-line pipedream/props-label,pipedream/props-description
13
- http: {
14
- type: "$.interface.http",
15
- customResponse: true,
16
- },
17
- objectType: {
18
- label: "Object Type",
19
- description: "The type of object for which to monitor events",
20
- propDefinition: [
21
- salesforce,
22
- "objectType",
23
- ],
24
- },
25
- },
26
- hooks: {
27
- async activate() {
28
- // Retrieve metadata about the SObject specified by the user
29
- const nameField = await this.salesforce.getNameFieldForObjectType(this.objectType);
30
- this.setNameField(nameField);
31
-
32
- // Create the webhook in the Salesforce platform
33
- const secretToken = uuidv4();
34
- let webhookData;
35
- try {
36
- webhookData = await this.createWebhook({
37
- endpointUrl: this.http.endpoint,
38
- sObjectType: this.objectType,
39
- event: this.getEventType(),
40
- secretToken,
41
- fieldsToCheck: this.getFieldsToCheck(),
42
- fieldsToCheckMode: this.getFieldsToCheckMode(),
43
- skipValidation: true, // neccessary for custom objects
44
- });
45
- } catch (err) {
46
- console.log("Create webhook error:", err);
47
- throw err;
48
- }
49
- this._setSecretToken(secretToken);
50
- this._setWebhookData(webhookData);
51
- },
52
- async deactivate() {
53
- // Create the webhook from the Salesforce platform
54
- const webhookData = this._getWebhookData();
55
- await this.deleteWebhook(webhookData);
56
- },
57
- },
58
- methods: {
59
- getClient() {
60
- const { salesforce } = this;
61
- return new SalesforceClient({
62
- apiVersion: salesforce._apiVersion(),
63
- authToken: salesforce._authToken(),
64
- instance: salesforce._subdomain(),
65
- });
66
- },
67
- createWebhook(args = {}) {
68
- const client = this.getClient();
69
- return client.createWebhook(args);
70
- },
71
- deleteWebhook(args = {}) {
72
- const client = this.getClient();
73
- return client.deleteWebhook(args);
74
- },
75
- _getSecretToken() {
76
- return this.db.get("secretToken");
77
- },
78
- _setSecretToken(secretToken) {
79
- this.db.set("secretToken", secretToken);
80
- },
81
- _getWebhookData() {
82
- return this.db.get("webhookData");
83
- },
84
- _setWebhookData(webhookData) {
85
- this.db.set("webhookData", webhookData);
86
- },
87
- getNameField() {
88
- return this.db.get("nameField");
89
- },
90
- setNameField(nameField) {
91
- this.db.set("nameField", nameField);
92
- },
93
- _isValidSource(event) {
94
- const webhookToken = event.headers["x-webhook-token"];
95
- const secretToken = this._getSecretToken();
96
- return webhookToken === secretToken;
97
- },
98
- processEvent(event) {
99
- const { body } = event;
100
- const meta = this.generateMeta(event);
101
- this.$emit(body, meta);
102
- },
103
- generateMeta() {
104
- throw new Error("generateMeta is not implemented");
105
- },
106
- getEventType() {
107
- throw new Error("getEventType is not implemented");
108
- },
109
- /**
110
- * This method returns the fields in the SObject type (e.g. Account, Lead, etc.) that the event
111
- * source should listen for updates to. This base implementation returns `undefined`, to not
112
- * necessitate any specific fields to be updated.
113
- *
114
- * @returns the fields in the SObject type for which to receive updates
115
- */
116
- getFieldsToCheck() {
117
- return undefined;
118
- },
119
- /**
120
- * This method returns whether the event source should listen for updates where `all` the fields
121
- * in the SObject are updated, or when `any` of them are. This base implementation returns
122
- * `undefined` to use to client's default `fieldToCheckMode` (`any`).
123
- *
124
- * @returns whether the webhook should receive events when `all` the fields to check are
125
- * updated, or when `any` of them are
126
- */
127
- getFieldsToCheckMode() {
128
- return undefined;
129
- },
130
- },
131
- async run(event) {
132
- if (!this._isValidSource(event)) {
133
- this.http.respond({
134
- statusCode: 404,
135
- });
136
- console.log("Skipping event from unrecognized source");
137
- return;
138
- }
139
-
140
- this.http.respond({
141
- statusCode: 200,
142
- });
143
-
144
- await this.processEvent(event);
145
- },
146
- };
@@ -1,91 +0,0 @@
1
- import startCase from "lodash/startCase.js";
2
-
3
- import common from "../common.mjs";
4
-
5
- export default {
6
- ...common,
7
- type: "source",
8
- name: "New Record (of Selectable Type)",
9
- key: "salesforce_rest_api-new-record",
10
- description: "Emit new event (at regular intervals) when a record of arbitrary object type (selected as an input parameter by the user) is created. See [the docs](https://sforce.co/3yPSJZy) for more information.",
11
- version: "0.0.6",
12
- hooks: {
13
- ...common.hooks,
14
- async activate() {
15
- const {
16
- objectType,
17
- getObjectTypeDescription,
18
- setObjectTypeColumns,
19
- } = this;
20
-
21
- await common.hooks.activate.call(this);
22
-
23
- const { fields } = await getObjectTypeDescription(objectType);
24
- const columns = fields.map(({ name }) => name);
25
-
26
- setObjectTypeColumns(columns);
27
- },
28
- },
29
- methods: {
30
- ...common.methods,
31
- generateMeta(item, fieldName) {
32
- const { objectType } = this;
33
- const {
34
- CreatedDate: createdDate,
35
- [fieldName]: name,
36
- Id: id,
37
- } = item;
38
- const entityType = startCase(objectType);
39
- const summary = `New ${entityType} created: ${name}`;
40
- const ts = Date.parse(createdDate);
41
- return {
42
- id,
43
- summary,
44
- ts,
45
- };
46
- },
47
- async processEvent(eventData) {
48
- const {
49
- paginate,
50
- objectType,
51
- setLatestDateCovered,
52
- getObjectTypeColumns,
53
- getNameField,
54
- generateMeta,
55
- $emit: emit,
56
- } = this;
57
-
58
- const {
59
- startTimestamp,
60
- endTimestamp,
61
- } = eventData;
62
-
63
- const fieldName = getNameField();
64
- const columns = getObjectTypeColumns();
65
-
66
- const events = await paginate({
67
- objectType,
68
- startTimestamp,
69
- endTimestamp,
70
- columns,
71
- });
72
-
73
- const [
74
- latestEvent,
75
- ] = events;
76
-
77
- if (latestEvent?.CreatedDate) {
78
- const latestDateCovered = new Date(latestEvent.CreatedDate);
79
- latestDateCovered.setSeconds(0);
80
- setLatestDateCovered(latestDateCovered.toISOString());
81
- }
82
-
83
- Array.from(events)
84
- .reverse()
85
- .forEach((item) => {
86
- const meta = generateMeta(item, fieldName);
87
- emit(item, meta);
88
- });
89
- },
90
- },
91
- };
@@ -1,51 +0,0 @@
1
- import startCase from "lodash/startCase.js";
2
-
3
- import common from "../common.mjs";
4
-
5
- export default {
6
- ...common,
7
- type: "source",
8
- name: "New Deleted Record (of Selectable Type)",
9
- key: "salesforce_rest_api-record-deleted",
10
- description: "Emit new event (at regular intervals) when a record of arbitrary object type (selected as an input parameter by the user) is deleted. [See the docs](https://sforce.co/3msDDEE) for more information.",
11
- version: "0.0.4",
12
- methods: {
13
- ...common.methods,
14
- generateMeta(item) {
15
- const {
16
- id,
17
- deletedDate,
18
- } = item;
19
- const entityType = startCase(this.objectType);
20
- const summary = `${entityType} deleted: ${id}`;
21
- const ts = Date.parse(deletedDate);
22
- return {
23
- id,
24
- summary,
25
- ts,
26
- };
27
- },
28
- async processEvent(eventData) {
29
- const {
30
- startTimestamp,
31
- endTimestamp,
32
- } = eventData;
33
- const {
34
- deletedRecords,
35
- latestDateCovered,
36
- } = await this.salesforce.getDeletedForObjectType(
37
- this.objectType,
38
- startTimestamp,
39
- endTimestamp,
40
- );
41
- this.setLatestDateCovered(latestDateCovered);
42
-
43
- // When a record is deleted, the `getDeleted` API only shows the ID of the
44
- // deleted item and the date in which it was deleted.
45
- deletedRecords.forEach((item) => {
46
- const meta = this.generateMeta(item);
47
- this.$emit(item, meta);
48
- });
49
- },
50
- },
51
- };
@@ -1,94 +0,0 @@
1
- import startCase from "lodash/startCase.js";
2
- import common from "../common.mjs";
3
- import constants from "../../common/constants.mjs";
4
-
5
- export default {
6
- ...common,
7
- type: "source",
8
- name: "New Updated Record (of Selectable Type)",
9
- key: "salesforce_rest_api-record-updated",
10
- description: "Emit new event (at regular intervals) when a record of arbitrary type (selected as an input parameter by the user) is updated. [See the docs](https://sforce.co/3yPSJZy) for more information.",
11
- version: "0.1.12",
12
- hooks: {
13
- ...common.hooks,
14
- async activate() {
15
- const {
16
- objectType,
17
- getObjectTypeDescription,
18
- setObjectTypeColumns,
19
- } = this;
20
-
21
- await common.hooks.activate.call(this);
22
-
23
- const { fields } = await getObjectTypeDescription(objectType);
24
- const columns = fields.map(({ name }) => name);
25
-
26
- setObjectTypeColumns(columns);
27
- },
28
- },
29
- methods: {
30
- ...common.methods,
31
- generateMeta(item, fieldName) {
32
- const { objectType } = this;
33
-
34
- const {
35
- LastModifiedDate: lastModifiedDate,
36
- [fieldName]: name,
37
- Id: id,
38
- } = item;
39
-
40
- const entityType = startCase(objectType);
41
- const summary = `${entityType} updated: ${name}`;
42
- const ts = Date.parse(lastModifiedDate);
43
- return {
44
- id: `${id}-${ts}`,
45
- summary,
46
- ts,
47
- };
48
- },
49
- async processEvent(eventData) {
50
- const {
51
- getNameField,
52
- getObjectTypeColumns,
53
- paginate,
54
- objectType,
55
- setLatestDateCovered,
56
- generateMeta,
57
- $emit: emit,
58
- } = this;
59
-
60
- const {
61
- startTimestamp,
62
- endTimestamp,
63
- } = eventData;
64
-
65
- const fieldName = getNameField();
66
- const columns = getObjectTypeColumns();
67
-
68
- const events = await paginate({
69
- objectType,
70
- startTimestamp,
71
- endTimestamp,
72
- columns,
73
- dateFieldName: constants.FIELD_NAME.LAST_MODIFIED_DATE,
74
- });
75
-
76
- const [
77
- latestEvent,
78
- ] = events;
79
-
80
- if (latestEvent?.LastModifiedDate) {
81
- const latestDateCovered = new Date(latestEvent.LastModifiedDate);
82
- latestDateCovered.setSeconds(0);
83
- setLatestDateCovered(latestDateCovered.toISOString());
84
- }
85
-
86
- Array.from(events)
87
- .reverse()
88
- .forEach((item) => {
89
- const meta = generateMeta(item, fieldName);
90
- emit(item, meta);
91
- });
92
- },
93
- },
94
- };
@@ -1,161 +0,0 @@
1
- import words from "lodash/words.js";
2
- import common from "../common.mjs";
3
-
4
- const { salesforce } = common.props;
5
-
6
- /**
7
- * Uses the Salesforce REST API's [sObject Get Updated endpoint](https://sforce.co/3yPSJZy) on the
8
- * [StandardObjectNamedHistory model](https://sforce.co/3Fn4lWB) to get changes to field values of
9
- * an sObject type. Associated sObject records are retrieved and emitted for history object records
10
- * matching configured `field` and `fieldUpdatedTo` prop values.
11
- */
12
- export default {
13
- ...common,
14
- dedupe: "greatest",
15
- type: "source",
16
- name: "New Updated Field on Record (of Selectable Type)",
17
- key: "salesforce_rest_api-updated-field-on-record",
18
- description: "Emit new event (at regular intervals) when a field of your choosing is updated on any record of a specified Salesforce object. Field history tracking must be enabled for the chosen field. See the docs on [field history tracking](https://sforce.co/3mtj0rF) and [history objects](https://sforce.co/3Fn4lWB) for more information.",
19
- version: "0.1.11",
20
- props: {
21
- ...common.props,
22
- objectType: {
23
- type: common.props.objectType.type,
24
- label: common.props.objectType.label,
25
- description: common.props.objectType.description,
26
- propDefinition: [
27
- salesforce,
28
- "objectType",
29
- () => ({
30
- filter: ({
31
- replicateable,
32
- associateEntityType,
33
- }) => replicateable && associateEntityType === "History",
34
- mapper: ({ associateParentEntity: value }) => words(value).join(" "),
35
- }),
36
- ],
37
- },
38
- field: {
39
- propDefinition: [
40
- salesforce,
41
- "field",
42
- ({ objectType }) => ({
43
- objectType,
44
- filter: ({ updateable }) => updateable,
45
- }),
46
- ],
47
- },
48
- fieldUpdatedTo: {
49
- propDefinition: [
50
- salesforce,
51
- "fieldUpdatedTo",
52
- ],
53
- },
54
- },
55
- hooks: {
56
- ...common.hooks,
57
- async activate() {
58
- const {
59
- objectType,
60
- getObjectTypeDescription,
61
- setHistoryObjectType,
62
- setObjectTypeColumns,
63
- } = this;
64
-
65
- await common.hooks.activate.call(this);
66
-
67
- const historyObjectType = `${objectType}History`;
68
-
69
- const { fields } = await getObjectTypeDescription(historyObjectType);
70
- const columns = fields.map(({ name }) => name);
71
-
72
- setHistoryObjectType(historyObjectType);
73
- setObjectTypeColumns(columns);
74
- },
75
- },
76
- methods: {
77
- ...common.methods,
78
- getHistoryObjectType() {
79
- return this.db.get("historyObjectType");
80
- },
81
- setHistoryObjectType(historyObjectType) {
82
- this.db.set("historyObjectType", historyObjectType);
83
- },
84
- isRelevant(item) {
85
- const {
86
- field,
87
- fieldUpdatedTo,
88
- } = this;
89
-
90
- const isFieldRelevant =
91
- item.Field === field
92
- || item.Field === `${item.DataType}${field}`;
93
-
94
- const isFieldValueRelevant =
95
- !fieldUpdatedTo
96
- || item.NewValue === fieldUpdatedTo;
97
-
98
- return isFieldRelevant && isFieldValueRelevant;
99
- },
100
- generateMeta(event) {
101
- const {
102
- objectType,
103
- field,
104
- } = this;
105
-
106
- const {
107
- CreatedDate: createdDate,
108
- Id: id,
109
- [`${objectType}Id`]: objectId,
110
- } = event;
111
-
112
- const ts = Date.parse(createdDate);
113
- return {
114
- id: `${id}-${ts}`,
115
- summary: `${field} on ${objectType}: ${objectId}`,
116
- ts,
117
- };
118
- },
119
- async processEvent({
120
- startTimestamp, endTimestamp,
121
- }) {
122
- const {
123
- getHistoryObjectType,
124
- getObjectTypeColumns,
125
- setLatestDateCovered,
126
- isRelevant,
127
- paginate,
128
- generateMeta,
129
- $emit: emit,
130
- } = this;
131
-
132
- const objectType = getHistoryObjectType();
133
- const columns = getObjectTypeColumns();
134
-
135
- const events = await paginate({
136
- objectType,
137
- startTimestamp,
138
- endTimestamp,
139
- columns,
140
- });
141
-
142
- const [
143
- latestEvent,
144
- ] = events;
145
-
146
- if (latestEvent?.CreatedDate) {
147
- const latestDateCovered = new Date(latestEvent.CreatedDate);
148
- latestDateCovered.setSeconds(0);
149
- setLatestDateCovered(latestDateCovered.toISOString());
150
- }
151
-
152
- Array.from(events)
153
- .reverse()
154
- .filter(isRelevant)
155
- .forEach((event) => {
156
- const meta = generateMeta(event);
157
- emit(event, meta);
158
- });
159
- },
160
- },
161
- };
@@ -1,76 +0,0 @@
1
- import startCase from "lodash/startCase.js";
2
-
3
- import common from "../common-instant.mjs";
4
- const { salesforce } = common.props;
5
-
6
- export default {
7
- ...common,
8
- type: "source",
9
- name: "New Updated Field on Record (Instant, of Selectable Type)",
10
- key: "salesforce_rest_api-updated-field-on-record-instant",
11
- description: "Emit new event immediately after a field of your choosing is updated on any record of a specified Salesforce object",
12
- version: "0.1.6",
13
- props: {
14
- ...common.props,
15
- field: {
16
- propDefinition: [
17
- salesforce,
18
- "field",
19
- ({ objectType }) => ({
20
- objectType,
21
- }),
22
- ],
23
- },
24
- fieldUpdatedTo: {
25
- propDefinition: [
26
- salesforce,
27
- "fieldUpdatedTo",
28
- ],
29
- },
30
- },
31
- methods: {
32
- ...common.methods,
33
- isEventRelevant(event) {
34
- if (!this.fieldUpdatedTo) {
35
- return true;
36
- }
37
- const { New: newObject } = event.body;
38
- const { [this.field]: newFieldValue } = newObject;
39
- return !this.fieldUpdatedTo || this.fieldUpdatedTo === newFieldValue;
40
- },
41
- generateMeta(data) {
42
- const nameField = this.getNameField();
43
- const { New: newObject } = data.body;
44
- const {
45
- LastModifiedDate: lastModifiedDate,
46
- Id: id,
47
- [nameField]: name,
48
- } = newObject;
49
- const entityType = startCase(this.objectType);
50
- const summary = `${this.field} on ${entityType}: ${name}`;
51
- const ts = Date.parse(lastModifiedDate);
52
- const compositeId = `${id}-${ts}`;
53
- return {
54
- id: compositeId,
55
- summary,
56
- ts,
57
- };
58
- },
59
- processEvent(event) {
60
- const { body } = event;
61
- if (!this.isEventRelevant(event)) {
62
- return;
63
- }
64
- const meta = this.generateMeta(event);
65
- this.$emit(body, meta);
66
- },
67
- getEventType() {
68
- return "updated";
69
- },
70
- getFieldsToCheck() {
71
- return [
72
- this.field,
73
- ];
74
- },
75
- },
76
- };