SFRA Server-side Javascript - Source: app_storefront_base/cartridge/controllers/Search.js menu

SFRA / Server-side JS / Source: app_storefront_base/cartridge/controllers/Search.js

  1. 'use strict';
  2. /**
  3. * @namespace Search
  4. */
  5. var server = require('server');
  6. var cache = require('*/cartridge/scripts/middleware/cache');
  7. var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
  8. var pageMetaData = require('*/cartridge/scripts/middleware/pageMetaData');
  9. /**
  10. * Search-UpdateGrid : This endpoint is called when the shopper changes the "Sort Order" or clicks "More Results" on the Product List page
  11. * @name Base/Search-UpdateGrid
  12. * @function
  13. * @memberof Search
  14. * @param {querystringparameter} - cgid - Category ID
  15. * @param {querystringparameter} - srule - Sort Rule ID
  16. * @param {querystringparameter} - start - Offset of the Page
  17. * @param {querystringparameter} - sz - Number of Products to Show on the List Page
  18. * @param {querystringparameter} - prefn1, prefn2 ... prefn(n) - Names of the selected preferences e.g. refinementColor. These will be added to the query parameters only when refinements are selected
  19. * @param {querystringparameter} - prefv1, prefv2 ... prefv(n) - Values of the selected preferences e.g. Blue. These will be added to the query parameters only when refinements are selected
  20. * @param {querystringparameter} - selectedUrl - The URL generated with the query parameters included
  21. * @param {category} - non-sensitive
  22. * @param {renders} - isml
  23. * @param {serverfunction} - get
  24. */
  25. server.get('UpdateGrid', function (req, res, next) {
  26. var CatalogMgr = require('dw/catalog/CatalogMgr');
  27. var ProductSearchModel = require('dw/catalog/ProductSearchModel');
  28. var searchHelper = require('*/cartridge/scripts/helpers/searchHelpers');
  29. var ProductSearch = require('*/cartridge/models/search/productSearch');
  30. var apiProductSearch = new ProductSearchModel();
  31. apiProductSearch = searchHelper.setupSearch(apiProductSearch, req.querystring, req.httpParameterMap);
  32. apiProductSearch.search();
  33. if (!apiProductSearch.personalizedSort) {
  34. searchHelper.applyCache(res);
  35. }
  36. var productSearch = new ProductSearch(
  37. apiProductSearch,
  38. req.querystring,
  39. req.querystring.srule,
  40. CatalogMgr.getSortingOptions(),
  41. CatalogMgr.getSiteCatalog().getRoot()
  42. );
  43. res.render('/search/productGrid', {
  44. productSearch: productSearch
  45. });
  46. next();
  47. });
  48. /**
  49. * Search-Refinebar : The endpoint Search-Refinebar render the refinement bar on product list page, PLP (i.e. the search result page and category listing page)
  50. * @name Base/Search-Refinebar
  51. * @function
  52. * @memberof Search
  53. * @param {middleware} - cache.applyDefaultCache
  54. * @param {querystringparameter} - q - The search string (when submit product search)
  55. * @param {querystringparameter} - cgid - category ID (when loading category list page)
  56. * @param {category} - non-sensitive
  57. * @param {renders} - isml
  58. * @param {serverfunction} - get
  59. */
  60. server.get('Refinebar', cache.applyDefaultCache, function (req, res, next) {
  61. var CatalogMgr = require('dw/catalog/CatalogMgr');
  62. var ProductSearchModel = require('dw/catalog/ProductSearchModel');
  63. var ProductSearch = require('*/cartridge/models/search/productSearch');
  64. var searchHelper = require('*/cartridge/scripts/helpers/searchHelpers');
  65. var apiProductSearch = new ProductSearchModel();
  66. apiProductSearch = searchHelper.setupSearch(apiProductSearch, req.querystring, req.httpParameterMap);
  67. apiProductSearch.search();
  68. var productSearch = new ProductSearch(
  69. apiProductSearch,
  70. req.querystring,
  71. req.querystring.srule,
  72. CatalogMgr.getSortingOptions(),
  73. CatalogMgr.getSiteCatalog().getRoot()
  74. );
  75. res.render('/search/searchRefineBar', {
  76. productSearch: productSearch,
  77. querystring: req.querystring
  78. });
  79. next();
  80. }, pageMetaData.computedPageMetaData);
  81. /**
  82. * Search-ShowAjax : This endpoint is called when a shopper click on any of the refinement eg. color, size, categories
  83. * @name Base/Search-ShowAjax
  84. * @function
  85. * @memberof Search
  86. * @param {middleware} - cache.applyShortPromotionSensitiveCache
  87. * @param {middleware} - consentTracking.consent
  88. * @param {querystringparameter} - cgid - Category ID
  89. * @param {querystringparameter} - q - query string a shopper is searching for
  90. * @param {querystringparameter} - prefn1, prefn2 ... prefn(n) - Names of the selected preferences e.g. refinementColor. These will be added to the query parameters only when refinements are selected
  91. * @param {querystringparameter} - prefv1, prefv2 ... prefv(n) - Values of the selected preferences e.g. Blue. These will be added to the query parameters only when refinements are selected
  92. * @param {querystringparameter} - pmin - preference for minimum amount
  93. * @param {querystringparameter} - pmax - preference for maximum amount
  94. * @param {querystringparameter} - page
  95. * @param {querystringparameter} - selectedUrl - The URL generated with the query parameters included
  96. * @param {category} - non-sensitive
  97. * @param {serverfunction} - get
  98. */
  99. server.get('ShowAjax', cache.applyShortPromotionSensitiveCache, consentTracking.consent, function (req, res, next) {
  100. var searchHelper = require('*/cartridge/scripts/helpers/searchHelpers');
  101. var result = searchHelper.search(req, res);
  102. if (result.searchRedirect) {
  103. res.redirect(result.searchRedirect);
  104. return next();
  105. }
  106. res.render('search/searchResultsNoDecorator', {
  107. productSearch: result.productSearch,
  108. maxSlots: result.maxSlots,
  109. reportingURLs: result.reportingURLs,
  110. refineurl: result.refineurl
  111. });
  112. return next();
  113. }, pageMetaData.computedPageMetaData);
  114. /**
  115. * Search-Show : This endpoint is called when a shopper type a query string in the search box
  116. * @name Base/Search-Show
  117. * @function
  118. * @memberof Search
  119. * @param {middleware} - cache.applyShortPromotionSensitiveCache
  120. * @param {middleware} - consentTracking.consent
  121. * @param {querystringparameter} - q - query string a shopper is searching for
  122. * @param {querystringparameter} - search-button
  123. * @param {querystringparameter} - lang - default is en_US
  124. * @param {querystringparameter} - cgid - Category ID
  125. * @param {category} - non-sensitive
  126. * @param {renders} = isml
  127. * @param {serverfunction} - get
  128. */
  129. server.get('Show', cache.applyShortPromotionSensitiveCache, consentTracking.consent, function (req, res, next) {
  130. var searchHelper = require('*/cartridge/scripts/helpers/searchHelpers');
  131. if (req.querystring.cgid) {
  132. var pageLookupResult = searchHelper.getPageDesignerCategoryPage(req.querystring.cgid);
  133. if ((pageLookupResult.page && pageLookupResult.page.hasVisibilityRules()) || pageLookupResult.invisiblePage) {
  134. // the result may be different for another user, do not cache on this level
  135. // the page itself is a remote include and can still be cached
  136. res.cachePeriod = 0; // eslint-disable-line no-param-reassign
  137. }
  138. if (pageLookupResult.page) {
  139. res.page(pageLookupResult.page.ID, {}, pageLookupResult.aspectAttributes);
  140. return next();
  141. }
  142. }
  143. var template = 'search/searchResults';
  144. var result = searchHelper.search(req, res);
  145. if (result.searchRedirect) {
  146. res.redirect(result.searchRedirect);
  147. return next();
  148. }
  149. if (result.category && result.categoryTemplate) {
  150. template = result.categoryTemplate;
  151. }
  152. var redirectGridUrl = searchHelper.backButtonDetection(req.session.clickStream);
  153. if (redirectGridUrl) {
  154. res.redirect(redirectGridUrl);
  155. }
  156. res.render(template, {
  157. productSearch: result.productSearch,
  158. maxSlots: result.maxSlots,
  159. reportingURLs: result.reportingURLs,
  160. refineurl: result.refineurl,
  161. category: result.category ? result.category : null,
  162. canonicalUrl: result.canonicalUrl,
  163. schemaData: result.schemaData,
  164. apiProductSearch: result.apiProductSearch
  165. });
  166. return next();
  167. }, pageMetaData.computedPageMetaData);
  168. /**
  169. * Search-Content : This endpoint is called when a shopper search for something under articles by clicking on the articles tab next to products on Search result page
  170. * @name Base/Search-Content
  171. * @function
  172. * @memberof Search
  173. * @param {middleware} - cache.applyDefaultCache
  174. * @param {middleware} - consentTracking.consent
  175. * @param {querystringparameter} - q - the query string a shopper is searching for
  176. * @param {querystringparameter} - startingPage - The starting page to display in the case there are multiple pages returned
  177. * @param {category} - non-sensitive
  178. * @param {renders} - isml
  179. * @param {serverfunction} - get
  180. */
  181. server.get('Content', cache.applyDefaultCache, consentTracking.consent, function (req, res, next) {
  182. var searchHelper = require('*/cartridge/scripts/helpers/searchHelpers');
  183. var contentSearch = searchHelper.setupContentSearch(req.querystring);
  184. res.render('/search/contentGrid', {
  185. contentSearch: contentSearch
  186. });
  187. next();
  188. });
  189. module.exports = server.exports();