From 3fe868c640f233f57b5247a20bd5786590b1e701 Mon Sep 17 00:00:00 2001 From: haroon Date: Mon, 9 Sep 2024 15:22:03 +0500 Subject: [PATCH 1/2] updated version --- components/remote_retrieval/README.md | 2 +- .../actions/all-orders/all-orders.mjs | 23 +++ .../create-device-order.mjs | 192 ++++++++++++++++++ .../get-pending-orders/get-pending-orders.mjs | 27 --- components/remote_retrieval/common/utils.mjs | 10 + components/remote_retrieval/package.json | 2 +- .../remote_retrieval/remote_retrieval.app.mjs | 64 ++---- .../remote_retrieval/sources/common/base.mjs | 14 ++ .../sources/common/events.mjs | 3 + .../sources/common/polling.mjs | 52 +++++ .../new-device-return-order.mjs | 30 +++ 11 files changed, 346 insertions(+), 73 deletions(-) create mode 100644 components/remote_retrieval/actions/all-orders/all-orders.mjs create mode 100644 components/remote_retrieval/actions/create-device-order/create-device-order.mjs delete mode 100644 components/remote_retrieval/actions/get-pending-orders/get-pending-orders.mjs create mode 100644 components/remote_retrieval/sources/common/base.mjs create mode 100644 components/remote_retrieval/sources/common/events.mjs create mode 100644 components/remote_retrieval/sources/common/polling.mjs create mode 100644 components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs diff --git a/components/remote_retrieval/README.md b/components/remote_retrieval/README.md index 7a39cbc6b01e6..aef3df86b44ed 100644 --- a/components/remote_retrieval/README.md +++ b/components/remote_retrieval/README.md @@ -1,3 +1,3 @@ # Overview -The Remote-Retriever API is tailored for automating the retrieval of contact information, enhancing your CRM data, or developing lead generation tools. By integrating it with Pipedream, you can efficiently extract valuable data and automate workflows for marketing, sales, or customer support. Pipedream’s serverless platform allows you to connect Retriever with numerous other apps, triggering actions based on new data, or updating systems instantly. +The Remote-Retrieval API is tailored for automating the retrieval of contact information, enhancing your CRM data, or developing lead generation tools. By integrating it with Pipedream, you can efficiently extract valuable data and automate workflows for marketing, sales, or customer support. Pipedream’s serverless platform allows you to connect Retrieval with numerous other apps, triggering actions based on new data, or updating systems instantly. diff --git a/components/remote_retrieval/actions/all-orders/all-orders.mjs b/components/remote_retrieval/actions/all-orders/all-orders.mjs new file mode 100644 index 0000000000000..60550eb0bfc7d --- /dev/null +++ b/components/remote_retrieval/actions/all-orders/all-orders.mjs @@ -0,0 +1,23 @@ +import app from "../../remote_retrieval.app.mjs"; + +export default { + key: "remote_retrieval-get-all-orders", + name: "Get All Order", + description: "Retrieve a list of all orders.[See the documentation](https://www.remoteretrieval.com/api-documentation/#pending-orders)", + type: "action", + version: "0.1.0", + props: { + app, + }, + methods: { + }, + async run({ $: step }) { + const response = await this.app.allOrders({ + step, + }); + + step.export("$summary", `Successfully retrieved ${response.results.length} order(s).`); + + return response; + }, +}; diff --git a/components/remote_retrieval/actions/create-device-order/create-device-order.mjs b/components/remote_retrieval/actions/create-device-order/create-device-order.mjs new file mode 100644 index 0000000000000..a3cc00674e11d --- /dev/null +++ b/components/remote_retrieval/actions/create-device-order/create-device-order.mjs @@ -0,0 +1,192 @@ +import app from "../../remote_retrieval.app.mjs"; + +export default { + key: "remote_retrieval-create-device-order", + name: "Create Device Order", + description: "Creates a device return order. [See the documentation](https://www.remoteretrieval.com/api-documentation/#create-order)", + type: "action", + version: "0.1.0", + props: { + app, + + employeeInfoEmail: { + type: "string", + label: "Employee Info Email", + description: "Used in email communications with the employee." + }, + employeeInfoName: { + type: "string", + label: "Employee Info Name", + description: "Employee full name to print on the shipping label." + }, + employeeInfoAdd_1: { + type: "string", + label: "Employee Info Address Line 1", + description: "The first line of the employee address" + }, + employeeInfoAdd_2: { + type: "string", + label: "Employee Info Address Line 2", + description: "The second line is optional for employee address", + optional: true , + }, + employeeInfoCity: { + type: "string", + label: "Employee Info City", + description: "City of employee", + }, + employeeInfoState: { + type: "string", + label: "Employee Info State", + description: "State of employee", + }, + employeeInfoZip: { + type: "string", + label: "Employee Info Zip", + description: "Zip code of employee", + }, + employeeInfoPhone: { + type: "string", + label: "Employee Info Phone", + description: "Phone of employee", + }, + employeeInfoCountry: { + type: "string", + label: "Employee Info Country", + description: "This service is only for USA", + options: ["US"], + default: "US", + }, + + companyInfoPerson: { + type: "string", + label: "Company Info Person Name", + description: "Receipient Name" + }, + companyInfoCompanyName: { + type: "string", + label: "Company Info Company Name", + description: "Company Name" + }, + companyInfoAdd_1: { + type: "string", + label: "Company Info Address Line 1", + description: "The first line of the company address" + }, + companyInfoAdd_2: { + type: "string", + label: "Company Info Address Line 2", + description: "The second line is optional for company address", + }, + companyInfoCity: { + type: "string", + label: "Company Info City", + description: "Company city", + }, + companyInfoState: { + type: "string", + label: "Company Info State", + description: "Company State(Example: TX,AL,NJ)", + }, + companyInfoZip: { + type: "string", + label: "Company Info Zip", + description: "Company Zip", + }, + companyInfoPhone: { + type: "string", + label: "Company Info Phone", + description: "Company Phone", + }, + companyInfoEmail: { + type: "string", + label: "Company Info Email", + description: "Company Email", + }, + typeOfEquipment: { + type: "string", + label: "Type of Equipment", + description: "You can choose 'Laptop' or 'Monitor'", + options: ['Laptop','Monitor'], + default: "Laptop" + }, + orderType: { + type: "string", + label: "Order Type", + description: "You can choose 'Return to Company' or 'Sell this Equipment'", + options: ['Return to Company','Sell this Equipment'], + default: "Return to Company" + }, + }, + + methods: { + createDeviceReturn(args = {}) { + return this.app.post({ + path: "/create-order/", + ...args, + }); + }, + }, + + + async run({ $: step }) { + const { + employeeInfoEmail, + employeeInfoName, + employeeInfoAdd_1, + employeeInfoAdd_2, + employeeInfoCity, + employeeInfoState, + employeeInfoZip, + employeeInfoPhone, + companyInfoPerson, + companyInfoCompanyName, + companyInfoAdd_1, + companyInfoAdd_2, + companyInfoCity, + companyInfoState, + companyInfoZip, + companyInfoPhone, + companyInfoEmail, + typeOfEquipment, + orderType + + } = this; + + const response = await createDeviceReturn({ + step, + data: { + type_of_equipment: typeOfEquipment, + order_type: orderType, + employee_info: { + email: employeeInfoEmail, + name: employeeInfoName, + address_line_1: employeeInfoAdd_1, + address_line_2: employeeInfoAdd_2, + address_city: employeeInfoCity, + address_state: employeeInfoState, + address_zip: employeeInfoZip, + phone: employeeInfoPhone, + }, + company_info: { + return_person_name: companyInfoPerson, + return_company_name: companyInfoCompanyName, + return_address_line_1: companyInfoAdd_1, + return_address_line_2: companyInfoAdd_2, + return_address_city: companyInfoCity, + return_address_state: companyInfoState, + return_address_zip: companyInfoZip, + email: companyInfoEmail, + phone: companyInfoPhone, + }, + }, + }); + + step.export("$summary", `Successfully created device return order with ID \`${response.order}\``); + + return response; + }, + + + +}; diff --git a/components/remote_retrieval/actions/get-pending-orders/get-pending-orders.mjs b/components/remote_retrieval/actions/get-pending-orders/get-pending-orders.mjs deleted file mode 100644 index 72c99b820af89..0000000000000 --- a/components/remote_retrieval/actions/get-pending-orders/get-pending-orders.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import app from "../../remote_retrieval.app.mjs"; -import utils from "../../common/utils.mjs"; - -export default { - key: "remote_retrieval-get-pending-orders", - name: "Get Pending Orders", - description: "Retrieve a list of the orders for which the payment process has not been completed.[See the documentation](https://www.remoteretrieval.com/api-documentation/#pending-orders)", - type: "action", - version: "0.0.1", - props: { - app, - }, - methods: {}, - async run({ $ }) { - const results = this.app.getResourcesStream({ - resourceFn: this.app.getPendingOrders, - resourceFnArgs: { - $, - }, - }); - const orders = await utils.streamIterator(results); - - $.export("$summary", `Successfully retrieved ${orders.length} pending order(s).`); - - return orders; - }, -}; diff --git a/components/remote_retrieval/common/utils.mjs b/components/remote_retrieval/common/utils.mjs index a7e8a35885f72..09602a28990c4 100644 --- a/components/remote_retrieval/common/utils.mjs +++ b/components/remote_retrieval/common/utils.mjs @@ -6,6 +6,16 @@ async function streamIterator(stream) { return resources; } + +function getParamFromUrl(url, key = "cursor") { + if (!url) { + return null; + } + const parsedUrl = new URL(url); + return parsedUrl.searchParams.get(key); +} + export default { streamIterator, + getParamFromUrl, }; diff --git a/components/remote_retrieval/package.json b/components/remote_retrieval/package.json index e386b5aa7437b..8ad117ae98409 100644 --- a/components/remote_retrieval/package.json +++ b/components/remote_retrieval/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/remote_retrieval", - "version": "0.1.0", + "version": "0.1.1", "description": "Pipedream Remote Retrieval Components", "main": "remote_retrieval.app.mjs", "keywords": [ diff --git a/components/remote_retrieval/remote_retrieval.app.mjs b/components/remote_retrieval/remote_retrieval.app.mjs index f5a22fabde358..32ff74e099663 100644 --- a/components/remote_retrieval/remote_retrieval.app.mjs +++ b/components/remote_retrieval/remote_retrieval.app.mjs @@ -1,32 +1,11 @@ import { axios } from "@pipedream/platform"; +import utils from "./common/utils.mjs"; import constants from "./common/constants.mjs"; export default { type: "app", app: "remote_retrieval", - propDefinitions: { - oid: { - type: "string", - label: "Order ID", - description: "The ID of the order to retrieve.", - async options({ page }) { - const orders = await this.getDeviceReturnOrders({ - params: { - page: page + 1, - }, - }); - if (orders.message === "Data not found!") { - return []; - } - return orders?.map(({ - order_id: value, shipments, - }) => ({ - value, - label: `Order ID: ${value} - ${shipments.device_type}`, - })) || []; - }, - }, - }, + propDefinitions: { }, methods: { getBaseUrl() { return `${constants.BASE_URL}${constants.VERSION_PATH}`; @@ -59,32 +38,20 @@ export default { ...args, }); }, - getOrder({ - oid, ...args - } = {}) { - return this.makeRequest({ - path: `/device_returns?oid=${oid}/`, - ...args, - }); - }, - getDeviceReturnOrders(args = {}) { - return this.makeRequest({ - path: "/device_returns", - ...args, - }); - }, - getPendingOrders(args = {}) { + allOrders(args = {}) { return this.makeRequest({ - path: "/pending-orders/", + path: "/orders/", ...args, }); }, + async *getResourcesStream({ resourceFn, resourceFnArgs, + resourceName, max = constants.DEFAULT_MAX, }) { - let page = 1; + let cursor; let resourcesCount = 0; while (true) { @@ -92,17 +59,19 @@ export default { await resourceFn({ ...resourceFnArgs, params: { - page, + cursor, ...resourceFnArgs?.params, }, }); - if (!response || response.message === "Data not found!") { + const nextResources = resourceName && response[resourceName] || response; + + if (!nextResources?.length) { console.log("No more resources found"); return; } - for (const resource of response) { + for (const resource of nextResources) { yield resource; resourcesCount += 1; @@ -111,8 +80,15 @@ export default { } } - page++; + if (!response.next) { + console.log("No next cursor found"); + return; + } + + cursor = utils.getParamFromUrl(response.next); } }, + + }, }; diff --git a/components/remote_retrieval/sources/common/base.mjs b/components/remote_retrieval/sources/common/base.mjs new file mode 100644 index 0000000000000..251f348aa67d7 --- /dev/null +++ b/components/remote_retrieval/sources/common/base.mjs @@ -0,0 +1,14 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../remote_retrieval.app.mjs"; + +export default { + props: { + app, + db: "$.service.db", + }, + methods: { + generateMeta() { + throw new ConfigurationError("generateMeta is not implemented"); + }, + }, +}; diff --git a/components/remote_retrieval/sources/common/events.mjs b/components/remote_retrieval/sources/common/events.mjs new file mode 100644 index 0000000000000..c9c6cf3b478b3 --- /dev/null +++ b/components/remote_retrieval/sources/common/events.mjs @@ -0,0 +1,3 @@ +export default { + DEFAULT: "default", +}; diff --git a/components/remote_retrieval/sources/common/polling.mjs b/components/remote_retrieval/sources/common/polling.mjs new file mode 100644 index 0000000000000..0698d04e4873b --- /dev/null +++ b/components/remote_retrieval/sources/common/polling.mjs @@ -0,0 +1,52 @@ +import { + ConfigurationError, + DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, +} from "@pipedream/platform"; +import common from "./base.mjs"; +import utils from "../../common/utils.mjs"; + +export default { + ...common, + props: { + ...common.props, + timer: { + type: "$.interface.timer", + label: "Polling schedule", + description: "How often to poll the API", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, + }, + }, + methods: { + ...common.methods, + getResourceName() { + throw new ConfigurationError("getResourceName is not implemented"); + }, + getResourceFn() { + throw new ConfigurationError("getResourceFn is not implemented"); + }, + getResourceFnArgs() { + throw new ConfigurationError("getResourceFnArgs is not implemented"); + }, + processEvent(resource) { + const meta = this.generateMeta(resource); + this.$emit(resource, meta); + }, + async processStreamEvents(resourcesStream) { + const resources = await utils.streamIterator(resourcesStream); + Array.from(resources) + .reverse() + .forEach(this.processEvent); + }, + }, + async run() { + const resourcesStream = this.app.getResourcesStream({ + resourceFn: this.getResourceFn(), + resourceFnArgs: this.getResourceFnArgs(), + resourceName: this.getResourceName(), + }); + + await this.processStreamEvents(resourcesStream); + }, +}; diff --git a/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs b/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs new file mode 100644 index 0000000000000..ff5a38d0c3456 --- /dev/null +++ b/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs @@ -0,0 +1,30 @@ +import common from "../common/polling.mjs"; + +export default { + ...common, + key: "retrieval-new-device-return-order", + name: "New Device Return Order", + description: "Triggers when a new device return order is created. [See the documentation](https://www.remoteretrieval.com/api-documentation/#all-orders)", + type: "source", + version: "0.1.0", + dedupe: "unique", + methods: { + ...common.methods, + getResourceName() { + return "results"; + }, + getResourceFn() { + return this.app.allOrders; + }, + getResourceFnArgs() { + return; + }, + generateMeta(resource) { + return { + id: resource.id, + summary: `New Order: ${resource.id}`, + ts: Date.parse(resource.created_at), + }; + }, + }, +}; From 3e9ccdc33c8ae989259d5e5760c41fce0140f5e4 Mon Sep 17 00:00:00 2001 From: remoteretrieval Date: Mon, 16 Sep 2024 17:11:39 +0500 Subject: [PATCH 2/2] update in component --- .../create-device-order.mjs | 1 + .../remote_retrieval/sources/common/base.mjs | 14 ----- .../sources/common/events.mjs | 3 -- .../sources/common/polling.mjs | 52 ------------------- .../new-device-return-order.mjs | 30 ----------- 5 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 components/remote_retrieval/sources/common/base.mjs delete mode 100644 components/remote_retrieval/sources/common/events.mjs delete mode 100644 components/remote_retrieval/sources/common/polling.mjs delete mode 100644 components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs diff --git a/components/remote_retrieval/actions/create-device-order/create-device-order.mjs b/components/remote_retrieval/actions/create-device-order/create-device-order.mjs index a3cc00674e11d..6cdbd5520bb99 100644 --- a/components/remote_retrieval/actions/create-device-order/create-device-order.mjs +++ b/components/remote_retrieval/actions/create-device-order/create-device-order.mjs @@ -131,6 +131,7 @@ export default { async run({ $: step }) { const { + createDeviceReturn, employeeInfoEmail, employeeInfoName, employeeInfoAdd_1, diff --git a/components/remote_retrieval/sources/common/base.mjs b/components/remote_retrieval/sources/common/base.mjs deleted file mode 100644 index 251f348aa67d7..0000000000000 --- a/components/remote_retrieval/sources/common/base.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import { ConfigurationError } from "@pipedream/platform"; -import app from "../../remote_retrieval.app.mjs"; - -export default { - props: { - app, - db: "$.service.db", - }, - methods: { - generateMeta() { - throw new ConfigurationError("generateMeta is not implemented"); - }, - }, -}; diff --git a/components/remote_retrieval/sources/common/events.mjs b/components/remote_retrieval/sources/common/events.mjs deleted file mode 100644 index c9c6cf3b478b3..0000000000000 --- a/components/remote_retrieval/sources/common/events.mjs +++ /dev/null @@ -1,3 +0,0 @@ -export default { - DEFAULT: "default", -}; diff --git a/components/remote_retrieval/sources/common/polling.mjs b/components/remote_retrieval/sources/common/polling.mjs deleted file mode 100644 index 0698d04e4873b..0000000000000 --- a/components/remote_retrieval/sources/common/polling.mjs +++ /dev/null @@ -1,52 +0,0 @@ -import { - ConfigurationError, - DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, -} from "@pipedream/platform"; -import common from "./base.mjs"; -import utils from "../../common/utils.mjs"; - -export default { - ...common, - props: { - ...common.props, - timer: { - type: "$.interface.timer", - label: "Polling schedule", - description: "How often to poll the API", - default: { - intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, - }, - }, - }, - methods: { - ...common.methods, - getResourceName() { - throw new ConfigurationError("getResourceName is not implemented"); - }, - getResourceFn() { - throw new ConfigurationError("getResourceFn is not implemented"); - }, - getResourceFnArgs() { - throw new ConfigurationError("getResourceFnArgs is not implemented"); - }, - processEvent(resource) { - const meta = this.generateMeta(resource); - this.$emit(resource, meta); - }, - async processStreamEvents(resourcesStream) { - const resources = await utils.streamIterator(resourcesStream); - Array.from(resources) - .reverse() - .forEach(this.processEvent); - }, - }, - async run() { - const resourcesStream = this.app.getResourcesStream({ - resourceFn: this.getResourceFn(), - resourceFnArgs: this.getResourceFnArgs(), - resourceName: this.getResourceName(), - }); - - await this.processStreamEvents(resourcesStream); - }, -}; diff --git a/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs b/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs deleted file mode 100644 index ff5a38d0c3456..0000000000000 --- a/components/remote_retrieval/sources/new-device-return-order/new-device-return-order.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import common from "../common/polling.mjs"; - -export default { - ...common, - key: "retrieval-new-device-return-order", - name: "New Device Return Order", - description: "Triggers when a new device return order is created. [See the documentation](https://www.remoteretrieval.com/api-documentation/#all-orders)", - type: "source", - version: "0.1.0", - dedupe: "unique", - methods: { - ...common.methods, - getResourceName() { - return "results"; - }, - getResourceFn() { - return this.app.allOrders; - }, - getResourceFnArgs() { - return; - }, - generateMeta(resource) { - return { - id: resource.id, - summary: `New Order: ${resource.id}`, - ts: Date.parse(resource.created_at), - }; - }, - }, -};