From e25478034b82520f8de797edaba8adbf1c7d03b3 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Fri, 28 Aug 2020 11:19:20 +0200 Subject: [PATCH] fix(medusa-plugin-brightpearl): more gentle inventory syncs --- .../loaders/inventory.js | 23 +++---- .../src/services/brightpearl.js | 62 +++++++++++++------ .../src/utils/brightpearl.js | 12 ++++ .../utils/brightpearl.js | 27 +++++--- 4 files changed, 86 insertions(+), 38 deletions(-) diff --git a/packages/medusa-plugin-brightpearl/loaders/inventory.js b/packages/medusa-plugin-brightpearl/loaders/inventory.js index edbcb5c6bb..e4d5ce58ba 100644 --- a/packages/medusa-plugin-brightpearl/loaders/inventory.js +++ b/packages/medusa-plugin-brightpearl/loaders/inventory.js @@ -18,38 +18,39 @@ var inventorySync = /*#__PURE__*/function () { case 0: brightpearlService = container.resolve("brightpearlService"); eventBus = container.resolve("eventBusService"); - _context.prev = 2; - _context.next = 5; + console.log("hi inventory"); + _context.prev = 3; + _context.next = 6; return brightpearlService.getClient(); - case 5: + case 6: client = _context.sent; pattern = "43 4,10,14,20 * * *"; // nice for tests "*/10 * * * * *" eventBus.createCronJob("inventory-sync", {}, pattern, brightpearlService.syncInventory()); - _context.next = 15; + _context.next = 16; break; - case 10: - _context.prev = 10; - _context.t0 = _context["catch"](2); + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](3); if (!(_context.t0.name === "not_allowed")) { - _context.next = 14; + _context.next = 15; break; } return _context.abrupt("return"); - case 14: + case 15: throw _context.t0; - case 15: + case 16: case "end": return _context.stop(); } } - }, _callee, null, [[2, 10]]); + }, _callee, null, [[3, 11]]); })); return function inventorySync(_x) { diff --git a/packages/medusa-plugin-brightpearl/src/services/brightpearl.js b/packages/medusa-plugin-brightpearl/src/services/brightpearl.js index 0c0f794a4f..2e873eb46e 100644 --- a/packages/medusa-plugin-brightpearl/src/services/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/src/services/brightpearl.js @@ -125,27 +125,51 @@ class BrightpearlService extends BaseService { async syncInventory() { const client = await this.getClient() const variants = await this.productVariantService_.list() - return Promise.all( - variants.map(async (v) => { - const brightpearlProduct = await this.retrieveProductBySKU(v.sku) - if (!brightpearlProduct) { - return - } - const { productId } = brightpearlProduct - const availability = await client.products.retrieveAvailability( - productId - ) - const onHand = availability[productId].total.onHand + let search = true + let bpProducts = [] + while (search) { + const { products, metadata } = await client.products.search(search) + bpProducts = [...bpProducts, ...products] + if (metadata.morePagesAvailable) { + search = `firstResult=${metadata.lastResult + 1}` + } else { + search = false + } + } - // Only update if the inventory levels have changed - if (parseInt(v.inventory_quantity) !== parseInt(onHand)) { - return this.productVariantService_.update(v._id, { - inventory_quantity: onHand, - }) - } - }) - ) + if (bpProducts.length) { + const productRange = `${bpProducts[0].productId}-${ + bpProducts[bpProducts.length - 1].productId + }` + + const availabilities = await client.products.retrieveAvailability( + productRange + ) + return Promise.all( + variants.map(async (v) => { + const brightpearlProduct = bpProducts.find( + (prod) => prod.SKU === v.sku + ) + if (!brightpearlProduct) { + return + } + + const { productId } = brightpearlProduct + const availability = availabilities[productId] + if (availability) { + const onHand = availability.total.onHand + + // Only update if the inventory levels have changed + if (parseInt(v.inventory_quantity) !== parseInt(onHand)) { + return this.productVariantService_.update(v._id, { + inventory_quantity: onHand, + }) + } + } + }) + ) + } } async updateInventory(productId) { diff --git a/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js b/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js index 1e7a26146f..136f5db885 100644 --- a/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js @@ -289,6 +289,18 @@ class BrightpearlClient { }) .then(({ data }) => data.response && data.response[0]) }, + search: (search) => { + return this.client_ + .request({ + url: `/product-service/product-search?${search}`, + }) + .then(({ data }) => { + return { + products: this.buildSearchResults_(data.response), + metadata: data.response.metaData, + } + }) + }, retrieveBySKU: (sku) => { return this.client_ .request({ diff --git a/packages/medusa-plugin-brightpearl/utils/brightpearl.js b/packages/medusa-plugin-brightpearl/utils/brightpearl.js index 9b594c365b..ded96e3cfb 100644 --- a/packages/medusa-plugin-brightpearl/utils/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/utils/brightpearl.js @@ -254,11 +254,22 @@ var BrightpearlClient = /*#__PURE__*/function () { return data.response && data.response[0]; }); }, + search: function search(_search) { + return _this.client_.request({ + url: "/product-service/product-search?".concat(_search) + }).then(function (_ref15) { + var data = _ref15.data; + return { + products: _this.buildSearchResults_(data.response), + metadata: data.response.metaData + }; + }); + }, retrieveBySKU: function retrieveBySKU(sku) { return _this.client_.request({ url: "/product-service/product-search?SKU=".concat(sku) - }).then(function (_ref15) { - var data = _ref15.data; + }).then(function (_ref16) { + var data = _ref16.data; return _this.buildSearchResults_(data.response); }); } @@ -270,8 +281,8 @@ var BrightpearlClient = /*#__PURE__*/function () { retrieveByEmail: function retrieveByEmail(email) { return _this.client_.request({ url: "/contact-service/contact-search?primaryEmail=".concat(email) - }).then(function (_ref16) { - var data = _ref16.data; + }).then(function (_ref17) { + var data = _ref17.data; return _this.buildSearchResults_(data.response); }); }, @@ -280,8 +291,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/contact-service/contact", method: "POST", data: customerData - }).then(function (_ref17) { - var data = _ref17.data; + }).then(function (_ref18) { + var data = _ref18.data; return data.response; }); } @@ -337,7 +348,7 @@ var BrightpearlClient = /*#__PURE__*/function () { return request; }); this.client_.interceptors.response.use(undefined, /*#__PURE__*/function () { - var _ref18 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(error) { + var _ref19 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(error) { var response; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { @@ -388,7 +399,7 @@ var BrightpearlClient = /*#__PURE__*/function () { })); return function (_x) { - return _ref18.apply(this, arguments); + return _ref19.apply(this, arguments); }; }()); }