@searchspring/snap-controller 0.37.0 → 0.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6N9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -134,33 +134,34 @@ var SearchController = /** @class */ (function (_super) {
134
134
  },
135
135
  };
136
136
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
137
- var params, err_1, stringyParams, prevStringyParams, preventBackfill, dontBackfill, searchProfile, _a, meta, response, previousResults_1, backfills, page, backfillParams, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
138
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
139
- return __generator(this, function (_m) {
140
- switch (_m.label) {
137
+ var params, err_1, stringyParams, prevStringyParams, searchProfile, meta_1, response_1, preventBackfill, dontBackfill, previousResults, backfills, pageSize, pagesNeeded1, totalResultsNeeded, apiLimit, backfillParams, pagesNeeded, lastPageCount, i, backfillParams, backfillResults_1, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
138
+ var _a, _b;
139
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
140
+ return __generator(this, function (_u) {
141
+ switch (_u.label) {
141
142
  case 0:
142
143
  if (!!this.initialized) return [3 /*break*/, 2];
143
144
  return [4 /*yield*/, this.init()];
144
145
  case 1:
145
- _m.sent();
146
- _m.label = 2;
146
+ _u.sent();
147
+ _u.label = 2;
147
148
  case 2:
148
149
  params = this.params;
149
- _m.label = 3;
150
+ _u.label = 3;
150
151
  case 3:
151
- _m.trys.push([3, 20, , 21]);
152
- _m.label = 4;
152
+ _u.trys.push([3, 23, , 24]);
153
+ _u.label = 4;
153
154
  case 4:
154
- _m.trys.push([4, 6, , 7]);
155
+ _u.trys.push([4, 6, , 7]);
155
156
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
156
157
  controller: this,
157
158
  request: params,
158
159
  })];
159
160
  case 5:
160
- _m.sent();
161
+ _u.sent();
161
162
  return [3 /*break*/, 7];
162
163
  case 6:
163
- err_1 = _m.sent();
164
+ err_1 = _u.sent();
164
165
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
165
166
  this.log.warn("'beforeSearch' middleware cancelled");
166
167
  return [2 /*return*/];
@@ -177,64 +178,120 @@ var SearchController = /** @class */ (function (_super) {
177
178
  // no param change - not searching
178
179
  return [2 /*return*/];
179
180
  }
180
- if ((_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) {
181
- preventBackfill = ((_c = this.config.settings.infinite) === null || _c === void 0 ? void 0 : _c.backfill) && !this.store.results.length && ((_d = params.pagination) === null || _d === void 0 ? void 0 : _d.page) > this.config.settings.infinite.backfill;
182
- dontBackfill = !((_e = this.config.settings.infinite) === null || _e === void 0 ? void 0 : _e.backfill) && !this.store.results.length && ((_f = params.pagination) === null || _f === void 0 ? void 0 : _f.page) > 1;
183
- if (preventBackfill || dontBackfill) {
184
- this.storage.set('scrollMap', {});
185
- this.urlManager.set('page', 1).go();
186
- return [2 /*return*/];
181
+ searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
182
+ if (!(((_c = this.config.settings) === null || _c === void 0 ? void 0 : _c.infinite) && ((_d = params.pagination) === null || _d === void 0 ? void 0 : _d.page) > 1)) return [3 /*break*/, 12];
183
+ preventBackfill = ((_e = this.config.settings.infinite) === null || _e === void 0 ? void 0 : _e.backfill) && !this.store.results.length && ((_f = params.pagination) === null || _f === void 0 ? void 0 : _f.page) > this.config.settings.infinite.backfill;
184
+ dontBackfill = !((_g = this.config.settings.infinite) === null || _g === void 0 ? void 0 : _g.backfill) && !this.store.results.length && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) > 1;
185
+ //if the page is higher than the backfill setting redirect back to page 1
186
+ if (preventBackfill || dontBackfill) {
187
+ this.storage.set('scrollMap', {});
188
+ this.urlManager.set('page', 1).go();
189
+ return [2 /*return*/];
190
+ }
191
+ previousResults = this.previousResults;
192
+ backfills = [];
193
+ if (((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults.length) {
194
+ pageSize = ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.pageSize) || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
195
+ pagesNeeded1 = ((_l = params.pagination) === null || _l === void 0 ? void 0 : _l.page) && ((_m = params.pagination) === null || _m === void 0 ? void 0 : _m.page) > ((_o = this.config.settings) === null || _o === void 0 ? void 0 : _o.infinite.backfill)
196
+ ? (_p = this.config.settings) === null || _p === void 0 ? void 0 : _p.infinite.backfill
197
+ : (_q = params.pagination) === null || _q === void 0 ? void 0 : _q.page;
198
+ totalResultsNeeded = pageSize * (pagesNeeded1 || 1);
199
+ apiLimit = 500;
200
+ // our search api is limited to a certain amount per request.
201
+ //so we will need to make more than one request if totalresultsneeded is greater.
202
+ if (totalResultsNeeded < apiLimit) {
203
+ backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { pageSize: totalResultsNeeded, page: 1 } });
204
+ backfills.push(this.client.search(backfillParams));
205
+ }
206
+ else {
207
+ pagesNeeded = Math.ceil(totalResultsNeeded / apiLimit);
208
+ lastPageCount = apiLimit - (pagesNeeded * apiLimit - totalResultsNeeded);
209
+ for (i = 1; i <= pagesNeeded; i++) {
210
+ backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { pageSize: i < pagesNeeded ? apiLimit : lastPageCount, page: i } });
211
+ backfills.push(this.client.search(backfillParams));
212
+ }
187
213
  }
188
214
  }
189
- searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
190
- return [4 /*yield*/, this.client.search(params)];
215
+ if (!(backfills && backfills.length)) return [3 /*break*/, 9];
216
+ backfillResults_1 = [];
217
+ return [4 /*yield*/, Promise.all(backfills)];
191
218
  case 8:
192
- _a = _m.sent(), meta = _a[0], response = _a[1];
219
+ backfillResponses = _u.sent();
220
+ backfillResponses.map(function (_a) {
221
+ var Bmeta = _a[0], Bresponse = _a[1];
222
+ if (!meta_1) {
223
+ meta_1 = Bmeta;
224
+ }
225
+ if (!response_1) {
226
+ response_1 = Bresponse;
227
+ backfillResults_1 = response_1.results;
228
+ }
229
+ else {
230
+ backfillResults_1 = backfillResults_1.concat(Bresponse.results);
231
+ }
232
+ });
233
+ if (!response_1.meta) {
234
+ /**
235
+ * MockClient will overwrite the client search() method and use
236
+ * SearchData to return mock data which already contains meta data
237
+ */
238
+ // @ts-ignore
239
+ response_1.meta = meta_1;
240
+ }
241
+ //we need to overwrite the pagination params so the ui doesnt get confused.
242
+ response_1.pagination.pageSize = ((_r = params.pagination) === null || _r === void 0 ? void 0 : _r.pageSize) || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
243
+ response_1.pagination.page = (_s = params.pagination) === null || _s === void 0 ? void 0 : _s.page;
244
+ //set the response results after all backfill promises are resolved.
245
+ response_1.results = backfillResults_1;
246
+ return [3 /*break*/, 11];
247
+ case 9: return [4 /*yield*/, this.client.search(params)];
248
+ case 10:
249
+ // infinite with no backfills.
250
+ _a = _u.sent(), meta_1 = _a[0], response_1 = _a[1];
193
251
  // @ts-ignore
194
- if (!response.meta) {
252
+ if (!response_1.meta) {
195
253
  /**
196
254
  * MockClient will overwrite the client search() method and use
197
255
  * SearchData to return mock data which already contains meta data
198
256
  */
199
257
  // @ts-ignore
200
- response.meta = meta;
258
+ response_1.meta = meta_1;
201
259
  }
202
- if (!(((_g = this.config.settings) === null || _g === void 0 ? void 0 : _g.infinite) && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) > 1)) return [3 /*break*/, 11];
203
- previousResults_1 = this.previousResults;
204
- if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
205
- backfills = [];
206
- for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
207
- backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { page: page } });
208
- backfills.push(this.client.search(backfillParams));
260
+ //append new results to previous results
261
+ response_1.results = __spreadArray(__spreadArray([], previousResults, true), (response_1.results || []), true);
262
+ _u.label = 11;
263
+ case 11: return [3 /*break*/, 14];
264
+ case 12: return [4 /*yield*/, this.client.search(params)];
265
+ case 13:
266
+ //standard.
267
+ _b = _u.sent(), meta_1 = _b[0], response_1 = _b[1];
268
+ // @ts-ignore
269
+ if (!response_1.meta) {
270
+ /**
271
+ * MockClient will overwrite the client search() method and use
272
+ * SearchData to return mock data which already contains meta data
273
+ */
274
+ // @ts-ignore
275
+ response_1.meta = meta_1;
209
276
  }
210
- return [4 /*yield*/, Promise.all(backfills)];
211
- case 9:
212
- backfillResponses = _m.sent();
213
- backfillResponses.map(function (_a) {
214
- var meta = _a[0], data = _a[1];
215
- previousResults_1 = previousResults_1.concat(data.results);
216
- });
217
- _m.label = 10;
218
- case 10:
219
- response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
220
- _m.label = 11;
221
- case 11:
277
+ _u.label = 14;
278
+ case 14:
222
279
  searchProfile.stop();
223
280
  this.log.profile(searchProfile);
224
281
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
225
- _m.label = 12;
226
- case 12:
227
- _m.trys.push([12, 14, , 15]);
282
+ _u.label = 15;
283
+ case 15:
284
+ _u.trys.push([15, 17, , 18]);
228
285
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
229
286
  controller: this,
230
287
  request: params,
231
- response: response,
288
+ response: response_1,
232
289
  })];
233
- case 13:
234
- _m.sent();
235
- return [3 /*break*/, 15];
236
- case 14:
237
- err_2 = _m.sent();
290
+ case 16:
291
+ _u.sent();
292
+ return [3 /*break*/, 18];
293
+ case 17:
294
+ err_2 = _u.sent();
238
295
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
239
296
  this.log.warn("'afterSearch' middleware cancelled");
240
297
  afterSearchProfile.stop();
@@ -244,29 +301,29 @@ var SearchController = /** @class */ (function (_super) {
244
301
  this.log.error("error in 'afterSearch' middleware");
245
302
  throw err_2;
246
303
  }
247
- return [3 /*break*/, 15];
248
- case 15:
304
+ return [3 /*break*/, 18];
305
+ case 18:
249
306
  afterSearchProfile.stop();
250
307
  this.log.profile(afterSearchProfile);
251
- if ((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite) {
252
- this.previousResults = JSON.parse(JSON.stringify(response.results));
308
+ if ((_t = this.config.settings) === null || _t === void 0 ? void 0 : _t.infinite) {
309
+ this.previousResults = JSON.parse(JSON.stringify(response_1.results));
253
310
  }
254
311
  // update the store
255
- this.store.update(response);
312
+ this.store.update(response_1);
256
313
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
257
- _m.label = 16;
258
- case 16:
259
- _m.trys.push([16, 18, , 19]);
314
+ _u.label = 19;
315
+ case 19:
316
+ _u.trys.push([19, 21, , 22]);
260
317
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
261
318
  controller: this,
262
319
  request: params,
263
- response: response,
320
+ response: response_1,
264
321
  })];
265
- case 17:
266
- _m.sent();
267
- return [3 /*break*/, 19];
268
- case 18:
269
- err_3 = _m.sent();
322
+ case 20:
323
+ _u.sent();
324
+ return [3 /*break*/, 22];
325
+ case 21:
326
+ err_3 = _u.sent();
270
327
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
271
328
  this.log.warn("'afterStore' middleware cancelled");
272
329
  afterStoreProfile.stop();
@@ -276,13 +333,13 @@ var SearchController = /** @class */ (function (_super) {
276
333
  this.log.error("error in 'afterStore' middleware");
277
334
  throw err_3;
278
335
  }
279
- return [3 /*break*/, 19];
280
- case 19:
336
+ return [3 /*break*/, 22];
337
+ case 22:
281
338
  afterStoreProfile.stop();
282
339
  this.log.profile(afterStoreProfile);
283
- return [3 /*break*/, 21];
284
- case 20:
285
- err_4 = _m.sent();
340
+ return [3 /*break*/, 24];
341
+ case 23:
342
+ err_4 = _u.sent();
286
343
  if (err_4) {
287
344
  switch (err_4) {
288
345
  case 429:
@@ -308,8 +365,8 @@ var SearchController = /** @class */ (function (_super) {
308
365
  this.store.loading = false;
309
366
  this.handleError(err_4);
310
367
  }
311
- return [3 /*break*/, 21];
312
- case 21: return [2 /*return*/];
368
+ return [3 /*break*/, 24];
369
+ case 24: return [2 /*return*/];
313
370
  }
314
371
  });
315
372
  }); };
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6N9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -79,45 +79,107 @@ export class SearchController extends AbstractController {
79
79
  // no param change - not searching
80
80
  return;
81
81
  }
82
- if (this.config.settings?.infinite) {
83
- // TODO: refactor this
82
+ const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
83
+ let meta;
84
+ let response;
85
+ // infinite functionality
86
+ // if params.page > 1 and infinite setting exists we should append results
87
+ if (this.config.settings?.infinite && params.pagination?.page > 1) {
84
88
  const preventBackfill = this.config.settings.infinite?.backfill && !this.store.results.length && params.pagination?.page > this.config.settings.infinite.backfill;
85
89
  const dontBackfill = !this.config.settings.infinite?.backfill && !this.store.results.length && params.pagination?.page > 1;
90
+ //if the page is higher than the backfill setting redirect back to page 1
86
91
  if (preventBackfill || dontBackfill) {
87
92
  this.storage.set('scrollMap', {});
88
93
  this.urlManager.set('page', 1).go();
89
94
  return;
90
95
  }
91
- }
92
- const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
93
- const [meta, response] = await this.client.search(params);
94
- // @ts-ignore
95
- if (!response.meta) {
96
- /**
97
- * MockClient will overwrite the client search() method and use
98
- * SearchData to return mock data which already contains meta data
99
- */
100
- // @ts-ignore
101
- response.meta = meta;
102
- }
103
- // infinite functionality
104
- // if params.page > 1 and infinite setting exists we should append results
105
- if (this.config.settings?.infinite && params.pagination?.page > 1) {
106
96
  // if no results fetch results...
107
97
  let previousResults = this.previousResults;
98
+ const backfills = [];
108
99
  if (this.config.settings?.infinite.backfill && !previousResults.length) {
109
100
  // figure out how many pages of results to backfill and wait on all responses
110
- const backfills = [];
111
- for (let page = 1; page < params.pagination?.page; page++) {
112
- const backfillParams = deepmerge({ ...params }, { pagination: { page } });
101
+ const pageSize = params.pagination?.pageSize || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
102
+ let pagesNeeded1 = params.pagination?.page && params.pagination?.page > this.config.settings?.infinite.backfill
103
+ ? this.config.settings?.infinite.backfill
104
+ : params.pagination?.page;
105
+ let totalResultsNeeded = pageSize * (pagesNeeded1 || 1);
106
+ const apiLimit = 500;
107
+ // our search api is limited to a certain amount per request.
108
+ //so we will need to make more than one request if totalresultsneeded is greater.
109
+ if (totalResultsNeeded < apiLimit) {
110
+ const backfillParams = deepmerge({ ...params }, { pagination: { pageSize: totalResultsNeeded, page: 1 } });
113
111
  backfills.push(this.client.search(backfillParams));
114
112
  }
113
+ else {
114
+ //how many pages are needed?
115
+ let pagesNeeded = Math.ceil(totalResultsNeeded / apiLimit);
116
+ // we dont want to get the full apiLimit # of results on the last page, so lets find out how many are left.
117
+ let lastPageCount = apiLimit - (pagesNeeded * apiLimit - totalResultsNeeded);
118
+ for (let i = 1; i <= pagesNeeded; i++) {
119
+ const backfillParams = deepmerge({ ...params }, { pagination: { pageSize: i < pagesNeeded ? apiLimit : lastPageCount, page: i } });
120
+ backfills.push(this.client.search(backfillParams));
121
+ }
122
+ }
123
+ }
124
+ //infinite backfill and prev results
125
+ // use the previous results and only make request for new result
126
+ if (backfills && backfills.length) {
127
+ let backfillResults = [];
115
128
  const backfillResponses = await Promise.all(backfills);
116
- backfillResponses.map(([meta, data]) => {
117
- previousResults = previousResults.concat(data.results);
129
+ backfillResponses.map(([Bmeta, Bresponse]) => {
130
+ if (!meta) {
131
+ meta = Bmeta;
132
+ }
133
+ if (!response) {
134
+ response = Bresponse;
135
+ backfillResults = response.results;
136
+ }
137
+ else {
138
+ backfillResults = backfillResults.concat(Bresponse.results);
139
+ }
118
140
  });
141
+ if (!response.meta) {
142
+ /**
143
+ * MockClient will overwrite the client search() method and use
144
+ * SearchData to return mock data which already contains meta data
145
+ */
146
+ // @ts-ignore
147
+ response.meta = meta;
148
+ }
149
+ //we need to overwrite the pagination params so the ui doesnt get confused.
150
+ response.pagination.pageSize = params.pagination?.pageSize || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
151
+ response.pagination.page = params.pagination?.page;
152
+ //set the response results after all backfill promises are resolved.
153
+ response.results = backfillResults;
154
+ }
155
+ else {
156
+ // infinite with no backfills.
157
+ [meta, response] = await this.client.search(params);
158
+ // @ts-ignore
159
+ if (!response.meta) {
160
+ /**
161
+ * MockClient will overwrite the client search() method and use
162
+ * SearchData to return mock data which already contains meta data
163
+ */
164
+ // @ts-ignore
165
+ response.meta = meta;
166
+ }
167
+ //append new results to previous results
168
+ response.results = [...previousResults, ...(response.results || [])];
169
+ }
170
+ }
171
+ else {
172
+ //standard.
173
+ [meta, response] = await this.client.search(params);
174
+ // @ts-ignore
175
+ if (!response.meta) {
176
+ /**
177
+ * MockClient will overwrite the client search() method and use
178
+ * SearchData to return mock data which already contains meta data
179
+ */
180
+ // @ts-ignore
181
+ response.meta = meta;
119
182
  }
120
- response.results = [...previousResults, ...(response.results || [])];
121
183
  }
122
184
  searchProfile.stop();
123
185
  this.log.profile(searchProfile);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.37.0",
3
+ "version": "0.37.1",
4
4
  "description": "Snap Controllers",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -20,21 +20,21 @@
20
20
  "test:watch": "jest --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@searchspring/snap-toolbox": "^0.37.0",
23
+ "@searchspring/snap-toolbox": "^0.37.1",
24
24
  "deepmerge": "4.2.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@searchspring/snap-client": "^0.37.0",
28
- "@searchspring/snap-event-manager": "^0.37.0",
29
- "@searchspring/snap-logger": "^0.37.0",
30
- "@searchspring/snap-profiler": "^0.37.0",
31
- "@searchspring/snap-store-mobx": "^0.37.0",
32
- "@searchspring/snap-tracker": "^0.37.0",
33
- "@searchspring/snap-url-manager": "^0.37.0"
27
+ "@searchspring/snap-client": "^0.37.1",
28
+ "@searchspring/snap-event-manager": "^0.37.1",
29
+ "@searchspring/snap-logger": "^0.37.1",
30
+ "@searchspring/snap-profiler": "^0.37.1",
31
+ "@searchspring/snap-store-mobx": "^0.37.1",
32
+ "@searchspring/snap-tracker": "^0.37.1",
33
+ "@searchspring/snap-url-manager": "^0.37.1"
34
34
  },
35
35
  "sideEffects": false,
36
36
  "files": [
37
37
  "dist/**/*"
38
38
  ],
39
- "gitHead": "d917c5638aa9a0d7eba3e453e70ff36278c96afa"
39
+ "gitHead": "aa7796aaea7e111ac70cb3f3349d4a096a64faf6"
40
40
  }