Extract fetch-by-page from BPE to service

This commit is contained in:
Rohan Mitchell
2014-11-21 09:56:29 +11:00
parent 58fdc48b9f
commit 824b00743e
3 changed files with 32 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
angular.module("ofn.admin").factory "BulkProducts", (dataFetcher) ->
angular.module("ofn.admin").factory "BulkProducts", (PagedFetcher, dataFetcher) ->
new class BulkProducts
products: []
@@ -6,13 +6,9 @@ angular.module("ofn.admin").factory "BulkProducts", (dataFetcher) ->
queryString = filters.reduce (qs,f) ->
return qs + "q[#{f.property.db_column}_#{f.predicate.predicate}]=#{f.value};"
, ""
return dataFetcher("/api/products/bulk_products?page=1;per_page=20;#{queryString}").then (data) =>
@addProducts data.products
if data.pages > 1
for page in [2..data.pages]
dataFetcher("/api/products/bulk_products?page=#{page};per_page=20;#{queryString}").then (data) =>
@addProducts data.products
url = "/api/products/bulk_products?page=::page::;per_page=20;#{queryString}"
PagedFetcher.fetch url, (data) => @addProducts data.products
cloneProduct: (product) ->
dataFetcher("/admin/products/" + product.permalink_live + "/clone.json").then (data) =>

View File

@@ -0,0 +1,16 @@
angular.module("ofn.admin").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) ->
dataFetcher(@urlForPage(url, 1)).then (data) =>
processData data
if data.pages > 1
for page in [2..data.pages]
dataFetcher(@urlForPage(url, page)).then (data) ->
processData data
urlForPage: (url, page) ->
url.replace("::page::", page)

View File

@@ -0,0 +1,13 @@
describe "PagedFetcher service", ->
PagedFetcher = null
beforeEach ->
module "ofn.admin"
beforeEach inject (_PagedFetcher_) ->
PagedFetcher = _PagedFetcher_
describe "substituting a page in the URL", ->
it "replaces ::page:: with the given page number", ->
expect(PagedFetcher.urlForPage("http://example.com/foo?page=::page::&per_page=20", 12)).
toEqual "http://example.com/foo?page=12&per_page=20"