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

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

  1. 'use strict';
  2. /**
  3. * @namespace SearchServices
  4. */
  5. var server = require('server');
  6. var cache = require('*/cartridge/scripts/middleware/cache');
  7. var Resource = require('dw/web/Resource');
  8. var preferences = require('*/cartridge/config/preferences.js');
  9. /**
  10. * SearchServices-GetSuggestions : The SearchServices-GetSuggestions endpoint is responsible for searching as you type and displaying the suggestions from that search
  11. * @name Base/SearchServices-GetSuggestions
  12. * @function
  13. * @memberof SearchServices
  14. * @param {middleware} - cache.applyDefaultCache
  15. * @param {querystringparameter} - q - the query string a shopper is searching for
  16. * @param {category} - non-sensitive
  17. * @param {returns} - json
  18. * @param {serverfunction} - get
  19. */
  20. server.get('GetSuggestions', cache.applyDefaultCache, function (req, res, next) {
  21. var SuggestModel = require('dw/suggest/SuggestModel');
  22. var CategorySuggestions = require('*/cartridge/models/search/suggestions/category');
  23. var ContentSuggestions = require('*/cartridge/models/search/suggestions/content');
  24. var ProductSuggestions = require('*/cartridge/models/search/suggestions/product');
  25. var SearchPhraseSuggestions = require('*/cartridge/models/search/suggestions/searchPhrase');
  26. var categorySuggestions;
  27. var contentSuggestions;
  28. var productSuggestions;
  29. var recentSuggestions;
  30. var popularSuggestions;
  31. var brandSuggestions;
  32. var searchTerms = req.querystring.q;
  33. var suggestions;
  34. // TODO: Move minChars and maxSuggestions to Site Preferences when ready for refactoring
  35. var minChars = preferences.minTermLength;
  36. // Unfortunately, by default, max suggestions is set to 10 and is not configurable in Business
  37. // Manager.
  38. var maxSuggestions = 3;
  39. if (searchTerms && searchTerms.length >= minChars) {
  40. suggestions = new SuggestModel();
  41. suggestions.setFilteredByFolder(false);
  42. suggestions.setSearchPhrase(searchTerms);
  43. suggestions.setMaxSuggestions(maxSuggestions);
  44. categorySuggestions = new CategorySuggestions(suggestions, maxSuggestions);
  45. contentSuggestions = new ContentSuggestions(suggestions, maxSuggestions);
  46. productSuggestions = new ProductSuggestions(suggestions, maxSuggestions);
  47. recentSuggestions = new SearchPhraseSuggestions(suggestions.recentSearchPhrases, maxSuggestions);
  48. popularSuggestions = new SearchPhraseSuggestions(suggestions.popularSearchPhrases, maxSuggestions);
  49. brandSuggestions = new SearchPhraseSuggestions(suggestions.brandSuggestions, maxSuggestions);
  50. if (productSuggestions.available || contentSuggestions.available
  51. || categorySuggestions.available
  52. || recentSuggestions.available
  53. || popularSuggestions.available
  54. || brandSuggestions.available) {
  55. var total = productSuggestions.products.length + contentSuggestions.contents.length
  56. + categorySuggestions.categories.length
  57. + recentSuggestions.phrases.length
  58. + popularSuggestions.phrases.length
  59. + brandSuggestions.phrases.length;
  60. res.render('search/suggestions', {
  61. suggestions: {
  62. product: productSuggestions,
  63. category: categorySuggestions,
  64. content: contentSuggestions,
  65. recent: recentSuggestions,
  66. popular: popularSuggestions,
  67. brand: brandSuggestions,
  68. message: Resource.msgf('label.header.search.result.count.msg', 'common', null, ['' + total])
  69. }
  70. });
  71. } else {
  72. res.json({});
  73. }
  74. } else {
  75. // Return an empty object that can be checked on the client. By default, rendered
  76. // templates automatically get a diagnostic string injected into it, making it difficult
  77. // to check for a null or empty response on the client.
  78. res.json({});
  79. }
  80. next();
  81. });
  82. module.exports = server.exports();