Merge branch 'hotfix/21.56.9' into master
[gitter.git] / modules / chats / lib / chat-search-service.js
blob689f4d04fdf93a188dc86bd0e7567e5503f678fb
1 'use strict';
3 var Promise = require('bluebird');
4 var _ = require('lodash');
5 var languageDetector = require('./language-detector');
6 var languageAnalyzerMapper = require('./language-analyzer-mapper');
7 var chatsForRoomSearch = require('gitter-web-elasticsearch/lib/chats-for-room-search');
8 var debug = require('debug')('gitter:app:chat-search-service');
10 var parseQuery = Promise.method(function(textQuery, userLang) {
11   /* Horrible hack - rip a from:xyz field out of the textQuery */
12   var fromUser;
13   textQuery = textQuery.replace(/\bfrom:('[^']*'|"[^"]*"|[^'"]\w*)/g, function(
14     wholeMatch,
15     fromField
16   ) {
17     fromUser = fromField;
18     return '';
19   });
21   if (!textQuery) {
22     return {
23       queryString: '',
24       fromUser: fromUser,
25       analyzers: ['default']
26     };
27   }
29   return languageDetector(textQuery).then(function(detectedLanguage) {
30     var analyzers = { default: true };
32     if (userLang) {
33       analyzers[languageAnalyzerMapper(userLang)] = true;
34     }
36     if (detectedLanguage) {
37       analyzers[languageAnalyzerMapper(detectedLanguage)] = true;
38     }
40     return {
41       queryString: textQuery,
42       fromUser: fromUser,
43       analyzers: Object.keys(analyzers)
44     };
45   });
46 });
48 /**
49  * Search for messages in a room using a full-text index.
50  *
51  * Returns promise messages
52  */
53 exports.searchChatMessagesForRoom = function(troupeId, textQuery, options) {
54   if (!options) options = {};
56   options = _.defaults(options, {
57     limit: 50,
58     skip: 0
59   });
61   return parseQuery(textQuery, options.lang).then(function(parsedQuery) {
62     debug('Search: %j', parsedQuery);
64     // TODO: deal with limit and skip
65     var searchResults = chatsForRoomSearch.searchRoom(troupeId, parsedQuery, options);
67     return searchResults;
68   });