search.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. module.exports = function(crowi, app) {
  2. 'use strict';
  3. // var debug = require('debug')('growi:routes:search')
  4. const Page = crowi.model('Page');
  5. const ApiResponse = require('../util/apiResponse');
  6. const ApiPaginate = require('../util/apiPaginate');
  7. const actions = {};
  8. const api = (actions.api = {});
  9. actions.searchPage = function(req, res) {
  10. const keyword = req.query.q || null;
  11. const search = crowi.getSearcher();
  12. if (!search) {
  13. return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
  14. }
  15. return res.render('search', {
  16. q: keyword,
  17. });
  18. };
  19. /**
  20. * @api {get} /search search page
  21. * @apiName Search
  22. * @apiGroup Search
  23. *
  24. * @apiParam {String} q keyword
  25. * @apiParam {String} path
  26. * @apiParam {String} offset
  27. * @apiParam {String} limit
  28. */
  29. api.search = async function(req, res) {
  30. const user = req.user;
  31. const { q: keyword = null, tree = null, type = null } = req.query;
  32. let paginateOpts;
  33. try {
  34. paginateOpts = ApiPaginate.parseOptionsForElasticSearch(req.query);
  35. }
  36. catch (e) {
  37. res.json(ApiResponse.error(e));
  38. }
  39. if (keyword === null || keyword === '') {
  40. return res.json(ApiResponse.error('keyword should not empty.'));
  41. }
  42. const search = crowi.getSearcher();
  43. if (!search) {
  44. return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
  45. }
  46. let userGroups = [];
  47. if (user != null) {
  48. const UserGroupRelation = crowi.model('UserGroupRelation');
  49. userGroups = await UserGroupRelation.findAllUserGroupIdsRelatedToUser(user);
  50. }
  51. const searchOpts = { ...paginateOpts, type };
  52. const result = {};
  53. try {
  54. let esResult;
  55. if (tree) {
  56. esResult = await search.searchKeywordUnderPath(keyword, tree, user, userGroups, searchOpts);
  57. }
  58. else {
  59. esResult = await search.searchKeyword(keyword, user, userGroups, searchOpts);
  60. }
  61. const findResult = await Page.findListByPageIds(esResult.data);
  62. result.meta = esResult.meta;
  63. result.totalCount = findResult.totalCount;
  64. result.data = findResult.pages
  65. .map(page => {
  66. page.bookmarkCount = (page._source && page._source.bookmark_count) || 0;
  67. return page;
  68. });
  69. }
  70. catch (err) {
  71. return res.json(ApiResponse.error(err));
  72. }
  73. return res.json(ApiResponse.success(result));
  74. };
  75. return actions;
  76. };