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..57f3ecef0f067 --- /dev/null +++ b/components/remote_retrieval/actions/all-orders/all-orders.mjs @@ -0,0 +1,22 @@ +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.0.1", + 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..09d9ed79a99df --- /dev/null +++ b/components/remote_retrieval/actions/create-device-order/create-device-order.mjs @@ -0,0 +1,196 @@ +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.0.1", + 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 { + createDeviceReturn, + 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 this.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/actions/get-specific-order/get-specific-order.mjs b/components/remote_retrieval/actions/get-specific-order/get-specific-order.mjs deleted file mode 100644 index fdc1c862a2c06..0000000000000 --- a/components/remote_retrieval/actions/get-specific-order/get-specific-order.mjs +++ /dev/null @@ -1,29 +0,0 @@ -import app from "../../remote_retrieval.app.mjs"; - -export default { - key: "remote_retrieval-get-specific-order", - name: "Get Specific Order", - description: "Fetches a single device return order. [See the documentation](https://www.remoteretrieval.com/api-documentation/#order-detail)", - type: "action", - version: "0.0.1", - props: { - app, - oid: { - propDefinition: [ - app, - "oid", - ], - }, - }, - async run({ $ }) { - const { oid } = this; - const response = await this.app.getOrder({ - $, - oid, - }); - - $.export("$summary", `Successfully retrieved order with ID \`${this.oid}\`.`); - - return response; - }, -}; diff --git a/components/remote_retrieval/common/utils.mjs b/components/remote_retrieval/common/utils.mjs index a7e8a35885f72..974339bb863b8 100644 --- a/components/remote_retrieval/common/utils.mjs +++ b/components/remote_retrieval/common/utils.mjs @@ -6,6 +6,15 @@ 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..6b00e0bb776e3 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.2.0", "description": "Pipedream Remote Retrieval Components", "main": "remote_retrieval.app.mjs", "keywords": [ @@ -14,5 +14,8 @@ }, "dependencies": { "@pipedream/platform": "^3.0.0" + }, + "devDependencies": { + "eslint": "^9.12.0" } } diff --git a/components/remote_retrieval/remote_retrieval.app.mjs b/components/remote_retrieval/remote_retrieval.app.mjs index f5a22fabde358..dd93630f0881e 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,14 @@ export default { } } - page++; + if (!response.next) { + console.log("No next cursor found"); + return; + } + + cursor = utils.getParamFromUrl(response.next); } }, + }, }; diff --git a/package-lock.json b/package-lock.json index 3477aaa6b77c6..44c4c50ce45b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@types/jest": "^27.4.1", "@typescript-eslint/eslint-plugin": "^5.27.1", "@typescript-eslint/parser": "^5.21.0", - "eslint": "8.15.0", + "eslint": "^8.15.0", "eslint-plugin-jest": "^26.5.3", "eslint-plugin-jsonc": "^1.6.0", "eslint-plugin-pipedream": "0.2.4", @@ -4681,8 +4681,10 @@ }, "node_modules/eslint": { "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint/eslintrc": "^1.2.3", "@humanwhocodes/config-array": "^0.9.2", @@ -14148,6 +14150,8 @@ }, "eslint": { "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.2.3", diff --git a/package.json b/package.json index 675a044924005..2c7c0ef710c3f 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@types/jest": "^27.4.1", "@typescript-eslint/eslint-plugin": "^5.27.1", "@typescript-eslint/parser": "^5.21.0", - "eslint": "8.15.0", + "eslint": "^8.15.0", "eslint-plugin-jest": "^26.5.3", "eslint-plugin-jsonc": "^1.6.0", "eslint-plugin-pipedream": "0.2.4",