search.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // eslint-disable-next-line no-unused-vars
  2. const logger = require('@alias/logger')('growi:service:search');
  3. class SearchService {
  4. constructor(crowi) {
  5. this.crowi = crowi;
  6. this.configManager = crowi.configManager;
  7. try {
  8. this.delegator = this.initDelegator();
  9. }
  10. catch (err) {
  11. logger.error(err);
  12. }
  13. if (this.isAvailable) {
  14. this.delegator.init();
  15. this.registerUpdateEvent();
  16. }
  17. }
  18. get isAvailable() {
  19. return this.delegator != null;
  20. }
  21. get isSearchboxEnabled() {
  22. return this.configManager.getConfig('crowi', 'app:searchboxSslUrl') != null;
  23. }
  24. get isElasticsearchEnabled() {
  25. return this.configManager.getConfig('crowi', 'app:elasticsearchUri') != null;
  26. }
  27. initDelegator() {
  28. logger.info('Initializing search delegator');
  29. const searchEvent = this.crowi.event('search');
  30. if (this.isSearchboxEnabled) {
  31. logger.info('Searchbox is enabled');
  32. const SearchboxDelegator = require('./search-delegator/searchbox.js');
  33. return new SearchboxDelegator(this.configManager, searchEvent);
  34. }
  35. if (this.isElasticsearchEnabled) {
  36. logger.info('Elasticsearch (not Searchbox) is enabled');
  37. const ElasticsearchDelegator = require('./search-delegator/elasticsearch.js');
  38. return new ElasticsearchDelegator(this.configManager, searchEvent);
  39. }
  40. }
  41. registerUpdateEvent() {
  42. const pageEvent = this.crowi.event('page');
  43. pageEvent.on('create', this.delegator.syncPageUpdated.bind(this.delegator));
  44. pageEvent.on('update', this.delegator.syncPageUpdated.bind(this.delegator));
  45. pageEvent.on('delete', this.delegator.syncPageDeleted.bind(this.delegator));
  46. const bookmarkEvent = this.crowi.event('bookmark');
  47. bookmarkEvent.on('create', this.delegator.syncBookmarkChanged.bind(this.delegator));
  48. bookmarkEvent.on('delete', this.delegator.syncBookmarkChanged.bind(this.delegator));
  49. const tagEvent = this.crowi.event('tag');
  50. tagEvent.on('update', this.delegator.syncTagChanged.bind(this.delegator));
  51. }
  52. getInfo() {
  53. return this.delegator.getInfo();
  54. }
  55. async buildIndex() {
  56. return this.delegator.buildIndex();
  57. }
  58. async searchKeyword(keyword, user, userGroups, searchOpts) {
  59. return this.delegator.searchKeyword(keyword, user, userGroups, searchOpts);
  60. }
  61. }
  62. module.exports = SearchService;