From 5bb2614f9d4bac48b927183036604217149afe0c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:58:37 +0200 Subject: [PATCH] Refactor PagedFetcher so it makes one request at a time --- .../services/paged_fetcher.js.coffee | 29 +++++++++++-------- .../variant_overrides_controller.js.coffee | 9 +++--- ...ariant_overrides_controller_spec.js.coffee | 4 +-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/admin/index_utils/services/paged_fetcher.js.coffee b/app/assets/javascripts/admin/index_utils/services/paged_fetcher.js.coffee index 82487996ae..96836ef9cc 100644 --- a/app/assets/javascripts/admin/index_utils/services/paged_fetcher.js.coffee +++ b/app/assets/javascripts/admin/index_utils/services/paged_fetcher.js.coffee @@ -2,19 +2,24 @@ angular.module("admin.indexUtils").factory "PagedFetcher", (dataFetcher) -> new class PagedFetcher # Given a URL like http://example.com/foo?page=::page::&per_page=20 # And the response includes an attribute pages with the number of pages to fetch - # Fetch each page async, and call the processData callback with the resulting data - fetch: (url, processData, onLastPageComplete) -> - dataFetcher(@urlForPage(url, 1)).then (data) => - processData data + # Fetch each page async, and call the pageCallback callback with the resulting data + # Developer note: this class should not be re-used! + page: 1 + last_page: 1 - if data.pages > 1 - for page in [2..data.pages] - lastPromise = dataFetcher(@urlForPage(url, page)).then (data) -> - processData data - onLastPageComplete && lastPromise.then onLastPageComplete - return - else - onLastPageComplete && onLastPageComplete() + fetch: (url, pageCallback) -> + @fetchPages(url, @page, pageCallback) urlForPage: (url, page) -> url.replace("::page::", page) + + fetchPages: (url, page, pageCallback) -> + dataFetcher(@urlForPage(url, page)).then (data) => + @page++ + @last_page = data.pages + + pageCallback(data) if pageCallback + + if @page <= @last_page + @fetchPages(url, @page, pageCallback) + diff --git a/app/assets/javascripts/admin/variant_overrides/controllers/variant_overrides_controller.js.coffee b/app/assets/javascripts/admin/variant_overrides/controllers/variant_overrides_controller.js.coffee index c37ba72071..b890d2ffd5 100644 --- a/app/assets/javascripts/admin/variant_overrides/controllers/variant_overrides_controller.js.coffee +++ b/app/assets/javascripts/admin/variant_overrides/controllers/variant_overrides_controller.js.coffee @@ -43,12 +43,11 @@ angular.module("admin.variantOverrides").controller "AdminVariantOverridesCtrl", $scope.fetchProducts = -> url = "/api/products/overridable?page=::page::;per_page=100" - PagedFetcher.fetch url, (data) => $scope.addProducts data.products + PagedFetcher.fetch url, $scope.addProducts - - $scope.addProducts = (products) -> - $scope.products = $scope.products.concat products - VariantOverrides.ensureDataFor hubs, products + $scope.addProducts = (data) -> + $scope.products = $scope.products.concat data.products + VariantOverrides.ensureDataFor hubs, data.products $scope.displayDirty = -> if DirtyVariantOverrides.count() > 0 diff --git a/spec/javascripts/unit/admin/controllers/variant_overrides_controller_spec.js.coffee b/spec/javascripts/unit/admin/controllers/variant_overrides_controller_spec.js.coffee index 5724fe1353..1c860e8e91 100644 --- a/spec/javascripts/unit/admin/controllers/variant_overrides_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/controllers/variant_overrides_controller_spec.js.coffee @@ -51,9 +51,9 @@ describe "VariantOverridesCtrl", -> it "adds products", -> spyOn(VariantOverrides, "ensureDataFor") expect(scope.products).toEqual [] - scope.addProducts ['a', 'b'] + scope.addProducts { products: ['a', 'b'] } expect(scope.products).toEqual ['a', 'b'] - scope.addProducts ['c', 'd'] + scope.addProducts { products: ['c', 'd'] } expect(scope.products).toEqual ['a', 'b', 'c', 'd'] expect(VariantOverrides.ensureDataFor).toHaveBeenCalled()