From 39f10cd93123a142d168a0772e0cad2bd382ee5d Mon Sep 17 00:00:00 2001 From: Luan Cazarine Date: Thu, 14 Nov 2024 13:52:29 -0300 Subject: [PATCH] [ACTION] Loops.so - Add to Mailing List #14614 Actions - Create Contact - Update Contact --- .../actions/common/common-create-update.mjs | 47 +++++++++++++++++++ .../actions/create-contact/create-contact.mjs | 15 ++---- .../actions/delete-contact/delete-contact.mjs | 2 +- .../actions/find-contact/find-contact.mjs | 2 +- .../list-custom-fields/list-custom-fields.mjs | 2 +- .../list-mailing-lists/list-mailing-lists.mjs | 2 +- .../actions/send-event/send-event.mjs | 2 +- .../send-transactional-email.mjs | 2 +- .../actions/update-contact/update-contact.mjs | 16 ++----- components/loops_so/common/utils.mjs | 24 ++++++++++ components/loops_so/loops_so.app.mjs | 34 ++++++++++++++ components/loops_so/package.json | 2 +- 12 files changed, 118 insertions(+), 32 deletions(-) create mode 100644 components/loops_so/common/utils.mjs diff --git a/components/loops_so/actions/common/common-create-update.mjs b/components/loops_so/actions/common/common-create-update.mjs index 2e591c4883cc3..e1f9a82c497d0 100644 --- a/components/loops_so/actions/common/common-create-update.mjs +++ b/components/loops_so/actions/common/common-create-update.mjs @@ -1,3 +1,6 @@ +/* eslint-disable no-unused-vars */ +import pickBy from "lodash.pickby"; +import { parseObject } from "../../common/utils.mjs"; import loops from "../../loops_so.app.mjs"; export default { @@ -31,12 +34,36 @@ export default { "lastName", ], }, + source: { + propDefinition: [ + loops, + "source", + ], + }, + subscribed: { + propDefinition: [ + loops, + "subscribed", + ], + }, userGroup: { propDefinition: [ loops, "userGroup", ], }, + userId: { + propDefinition: [ + loops, + "userId", + ], + }, + mailingLists: { + propDefinition: [ + loops, + "mailingLists", + ], + }, customFields: { propDefinition: [ loops, @@ -44,4 +71,24 @@ export default { ], }, }, + methods: { + prepareData() { + const { + loops, + customFields, + mailingLists, + ...data + } = this; + + const mailingListObject = {}; + for (const item of (parseObject(mailingLists) || [])) { + mailingListObject[item] = true; + } + + return pickBy({ + mailingLists: mailingListObject, + ...data, + }); + }, + }, }; diff --git a/components/loops_so/actions/create-contact/create-contact.mjs b/components/loops_so/actions/create-contact/create-contact.mjs index aa1af0b007fdf..d03452435b8f3 100644 --- a/components/loops_so/actions/create-contact/create-contact.mjs +++ b/components/loops_so/actions/create-contact/create-contact.mjs @@ -5,20 +5,11 @@ export default { key: "loops_so-create-contact", name: "Create Contact", description: "Creates a new contact. [See the Documentation](https://loops.so/docs/add-users/api-reference#add)", - version: "0.1.1", + version: "0.2.0", type: "action", async run({ $ }) { - const { // eslint-disable-next-line no-unused-vars - loops, email, firstName, lastName, userGroup, customFields, ...data - } = this; - const response = await loops.createContact({ - data: { - email, - firstName, - lastName, - userGroup, - ...data, - }, + const response = await this.loops.createContact({ + data: this.prepareData(), $, }); diff --git a/components/loops_so/actions/delete-contact/delete-contact.mjs b/components/loops_so/actions/delete-contact/delete-contact.mjs index 1d5e9a111f664..42e413253270f 100644 --- a/components/loops_so/actions/delete-contact/delete-contact.mjs +++ b/components/loops_so/actions/delete-contact/delete-contact.mjs @@ -5,7 +5,7 @@ export default { key: "loops_so-delete-contact", name: "Delete Contact", description: "Delete an existing contact. [See the documentation](https://loops.so/docs/api-reference/delete-contact)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { loops, diff --git a/components/loops_so/actions/find-contact/find-contact.mjs b/components/loops_so/actions/find-contact/find-contact.mjs index 2ef773e7bf0db..9fba12feeda25 100644 --- a/components/loops_so/actions/find-contact/find-contact.mjs +++ b/components/loops_so/actions/find-contact/find-contact.mjs @@ -4,7 +4,7 @@ export default { key: "loops_so-find-contact", name: "Find Contact", description: "Search for a contact by email address. [See the Documentation](https://loops.so/docs/add-users/api-reference#find)", - version: "0.0.3", + version: "0.0.4", type: "action", props: { loops, diff --git a/components/loops_so/actions/list-custom-fields/list-custom-fields.mjs b/components/loops_so/actions/list-custom-fields/list-custom-fields.mjs index 6f09402dd9de2..f622635091b91 100644 --- a/components/loops_so/actions/list-custom-fields/list-custom-fields.mjs +++ b/components/loops_so/actions/list-custom-fields/list-custom-fields.mjs @@ -4,7 +4,7 @@ export default { key: "loops_so-list-custom-fields", name: "List Custom Fields", description: "List your account's custom contact properties. [See the documentation](https://loops.so/docs/api-reference/list-custom-fields)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { loops, diff --git a/components/loops_so/actions/list-mailing-lists/list-mailing-lists.mjs b/components/loops_so/actions/list-mailing-lists/list-mailing-lists.mjs index 331f0d415ebb0..48530bddebf2d 100644 --- a/components/loops_so/actions/list-mailing-lists/list-mailing-lists.mjs +++ b/components/loops_so/actions/list-mailing-lists/list-mailing-lists.mjs @@ -4,7 +4,7 @@ export default { key: "loops_so-list-mailing-lists", name: "List Mailing Lists", description: "List your account's mailing lists. [See the documentation](https://loops.so/docs/api-reference/list-mailing-lists)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { loops, diff --git a/components/loops_so/actions/send-event/send-event.mjs b/components/loops_so/actions/send-event/send-event.mjs index bd05174c56e99..230148ba3a31d 100644 --- a/components/loops_so/actions/send-event/send-event.mjs +++ b/components/loops_so/actions/send-event/send-event.mjs @@ -4,7 +4,7 @@ export default { key: "loops_so-send-event", name: "Send Event", description: "Send an event to an email address. [See the Documentation](https://loops.so/docs/add-users/api-reference#send)", - version: "0.0.3", + version: "0.0.4", type: "action", props: { loops, diff --git a/components/loops_so/actions/send-transactional-email/send-transactional-email.mjs b/components/loops_so/actions/send-transactional-email/send-transactional-email.mjs index 73c4a65cfd9d3..d964d899749f3 100644 --- a/components/loops_so/actions/send-transactional-email/send-transactional-email.mjs +++ b/components/loops_so/actions/send-transactional-email/send-transactional-email.mjs @@ -4,7 +4,7 @@ export default { key: "loops_so-send-transactional-email", name: "Send Transactional Email", description: "Send a transactional email. [See the Documentation](https://loops.so/docs/transactional/guide#send-your-email)", - version: "0.0.3", + version: "0.0.4", type: "action", props: { loops, diff --git a/components/loops_so/actions/update-contact/update-contact.mjs b/components/loops_so/actions/update-contact/update-contact.mjs index 1de02233ac884..fee9d3bd85561 100644 --- a/components/loops_so/actions/update-contact/update-contact.mjs +++ b/components/loops_so/actions/update-contact/update-contact.mjs @@ -1,25 +1,15 @@ import common from "../common/common-create-update.mjs"; -import pickBy from "lodash.pickby"; export default { ...common, key: "loops_so-update-contact", name: "Update Contact", description: "Updates an existing contact by email. If email not found, a new contact will be created. [See the Documentation](https://loops.so/docs/add-users/api-reference#update)", - version: "0.1.1", + version: "0.2.0", type: "action", async run({ $ }) { - const { // eslint-disable-next-line no-unused-vars - loops, email, firstName, lastName, userGroup, customFields, ...data - } = this; - const response = await loops.updateContact({ - data: pickBy({ - email, - firstName, - lastName, - userGroup, - ...data, - }), + const response = await this.loops.updateContact({ + data: this.prepareData(), $, }); diff --git a/components/loops_so/common/utils.mjs b/components/loops_so/common/utils.mjs new file mode 100644 index 0000000000000..dcc9cc61f6f41 --- /dev/null +++ b/components/loops_so/common/utils.mjs @@ -0,0 +1,24 @@ +export const parseObject = (obj) => { + if (!obj) return undefined; + + if (Array.isArray(obj)) { + return obj.map((item) => { + if (typeof item === "string") { + try { + return JSON.parse(item); + } catch (e) { + return item; + } + } + return item; + }); + } + if (typeof obj === "string") { + try { + return JSON.parse(obj); + } catch (e) { + return obj; + } + } + return obj; +}; diff --git a/components/loops_so/loops_so.app.mjs b/components/loops_so/loops_so.app.mjs index 10d7ef3c3da17..be6e9edf07dd4 100644 --- a/components/loops_so/loops_so.app.mjs +++ b/components/loops_so/loops_so.app.mjs @@ -21,12 +21,46 @@ export default { description: "The last name of the contact", optional: true, }, + source: { + type: "string", + label: "Source", + description: "A custom source value to replace the default **API**. [Read more](https://loops.so/docs/contacts/properties#source).", + optional: true, + }, + subscribed: { + type: "boolean", + label: "Subscribed", + description: "Whether the contact will receive campaign and loops emails. [Read more](https://loops.so/docs/contacts/properties#subscribed).", + optional: true, + }, userGroup: { type: "string", label: "User Group", description: "User group of the contact", optional: true, }, + userId: { + type: "string", + label: "User Id", + description: "A unique user ID (for example, from an external application). [Read more](https://loops.so/docs/contacts/properties#user-id).", + optional: true, + }, + mailingLists: { + type: "string[]", + label: "Mailing Lists", + description: "A list of mailing list IDs", + async options() { + const data = await this.listMailingLists(); + return data.map(({ + id: value, + name: label, + }) => ({ + label, + value, + })); + }, + optional: true, + }, customFields: { type: "string[]", label: "Custom Fields", diff --git a/components/loops_so/package.json b/components/loops_so/package.json index ada57b44b3e17..8dc67ee930a14 100644 --- a/components/loops_so/package.json +++ b/components/loops_so/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/loops_so", - "version": "0.3.0", + "version": "0.3.1", "description": "Pipedream Loops.so Components", "main": "loops_so.app.mjs", "keywords": [