Просмотр исходного кода

ensure to register searchService even if unconfigurable

Yuki Takei 6 лет назад
Родитель
Сommit
a211460b35

+ 2 - 17
src/server/crowi/index.js

@@ -38,7 +38,6 @@ function Crowi(rootdir) {
 
   this.config = {};
   this.configManager = null;
-  this.searcher = null;
   this.mailer = {};
   this.passportService = null;
   this.globalNotificationService = null;
@@ -51,6 +50,7 @@ function Crowi(rootdir) {
   this.growiBridgeService = null;
   this.exportService = null;
   this.importService = null;
+  this.searchService = null;
   this.cdnResourcesService = new CdnResourcesService();
   this.interceptorManager = new InterceptorManager();
   this.xss = new Xss();
@@ -279,10 +279,6 @@ Crowi.prototype.scanRuntimeVersions = async function() {
   });
 };
 
-Crowi.prototype.getSearcher = function() {
-  return this.searcher;
-};
-
 Crowi.prototype.getMailer = function() {
   return this.mailer;
 };
@@ -331,18 +327,7 @@ Crowi.prototype.setupPassport = async function() {
 
 Crowi.prototype.setupSearcher = async function() {
   const SearchService = require('@server/service/search');
-  const searchService = new SearchService(this);
-
-  if (searchService.isConfigured) {
-    try {
-      this.searchService = searchService;
-      this.searcher = searchService; // TODO: use `searchService` instead of `searcher`
-    }
-    catch (e) {
-      logger.error('Error on setup searcher', e);
-      this.searcher = null;
-    }
-  }
+  this.searchService = new SearchService(this);
 };
 
 Crowi.prototype.setupMailer = async function() {

+ 3 - 2
src/server/routes/admin.js

@@ -224,8 +224,9 @@ module.exports = function(crowi, app) {
 
   actions.search = {};
   actions.search.index = function(req, res) {
-    const search = crowi.getSearcher();
-    if (!search) {
+    const { searchService } = crowi;
+    if (!searchService.isConfigured) {
+      logger.warn('SearchService has not configured');
       return res.redirect('/admin');
     }
 

+ 10 - 5
src/server/routes/apiv3/healthcheck.js

@@ -116,12 +116,17 @@ module.exports = (crowi) => {
     }
 
     // connect to search service
-    try {
-      const search = crowi.getSearcher();
-      info.searchInfo = await search.getInfo();
+    const { searchService } = crowi;
+    if (!searchService.isConfigured) {
+      errors.push(new ErrorV3('The Search Service is not configured', 'healthcheck-search-not-configured'));
     }
-    catch (err) {
-      errors.push(new ErrorV3(`The Search Service is not connectable - ${err.message}`, 'healthcheck-search-unhealthy', err.stack));
+    else {
+      try {
+        info.searchInfo = await searchService.getInfo();
+      }
+      catch (err) {
+        errors.push(new ErrorV3(`The Search Service is not connectable - ${err.message}`, 'healthcheck-search-unhealthy', err.stack));
+      }
     }
 
     if (errors.length > 0) {

+ 16 - 9
src/server/routes/apiv3/search.js

@@ -9,6 +9,7 @@ const router = express.Router();
 
 const helmet = require('helmet');
 
+const ErrorV3 = require('../../models/vo/error-apiv3');
 
 /**
  * @swagger
@@ -43,8 +44,10 @@ module.exports = (crowi) => {
    */
   router.get('/indices', helmet.noCache(), accessTokenParser, loginRequired, adminRequired, async(req, res) => {
     try {
-      const search = crowi.getSearcher();
-      const info = await search.getInfoForAdmin();
+      const { searchService } = crowi;
+      const info = searchService.isReachable
+        ? await searchService.getInfoForAdmin()
+        : {};
       return res.status(200).send({ info });
     }
     catch (err) {
@@ -66,8 +69,8 @@ module.exports = (crowi) => {
    */
   router.post('/connection', accessTokenParser, loginRequired, adminRequired, async(req, res) => {
     try {
-      const search = crowi.getSearcher();
-      await search.initClient();
+      const { searchService } = crowi;
+      await searchService.initClient();
       return res.status(200).send();
     }
     catch (err) {
@@ -106,24 +109,28 @@ module.exports = (crowi) => {
   router.put('/indices', accessTokenParser, loginRequired, adminRequired, csrf, validatorForPutIndices, ApiV3FormValidator, async(req, res) => {
     const operation = req.body.operation;
 
-    try {
-      const search = crowi.getSearcher();
+    const { searchService } = crowi;
+
+    if (!searchService.isReachable) {
+      return res.apiv3Err(new ErrorV3('SearchService is not reachable', 'search-service-unreachable'));
+    }
 
+    try {
       switch (operation) {
         case 'normalize':
           // wait the processing is terminated
-          await search.normalizeIndices();
+          await searchService.normalizeIndices();
           return res.status(200).send({ message: 'Operation is successfully processed.' });
         case 'rebuild':
           // NOT wait the processing is terminated
-          search.rebuildIndex();
+          searchService.rebuildIndex();
           return res.status(200).send({ message: 'Operation is successfully requested.' });
         default:
           throw new Error(`Unimplemented operation: ${operation}`);
       }
     }
     catch (err) {
-      return res.apiv3Err(err);
+      return res.apiv3Err(err, 503);
     }
   });
 

+ 3 - 3
src/server/routes/installer.js

@@ -12,12 +12,12 @@ module.exports = function(crowi, app) {
   const actions = {};
 
   async function initSearchIndex() {
-    const search = crowi.getSearcher();
-    if (search == null) {
+    const { searchService } = crowi;
+    if (!searchService.isReachable) {
       return;
     }
 
-    await search.rebuildIndex();
+    await searchService.rebuildIndex();
   }
 
   async function createInitialPages(owner, lang) {

+ 5 - 5
src/server/routes/search.js

@@ -35,8 +35,8 @@ module.exports = function(crowi, app) {
 
   actions.searchPage = function(req, res) {
     const keyword = req.query.q || null;
-    const search = crowi.getSearcher();
-    if (!search) {
+    const { searchService } = crowi;
+    if (!searchService.isReachable) {
       return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
     }
 
@@ -125,8 +125,8 @@ module.exports = function(crowi, app) {
       return res.json(ApiResponse.error('keyword should not empty.'));
     }
 
-    const search = crowi.getSearcher();
-    if (!search) {
+    const { searchService } = crowi;
+    if (!searchService.isReachable) {
       return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
     }
 
@@ -140,7 +140,7 @@ module.exports = function(crowi, app) {
 
     const result = {};
     try {
-      const esResult = await search.searchKeyword(keyword, user, userGroups, searchOpts);
+      const esResult = await searchService.searchKeyword(keyword, user, userGroups, searchOpts);
 
       // create score map for sorting
       // key: id , value: score

+ 2 - 2
src/server/util/swigFunctions.js

@@ -115,8 +115,8 @@ module.exports = function(crowi, req, locals) {
   };
 
   locals.isSearchServiceConfigured = function() {
-    const searchService = crowi.getSearcher();
-    return searchService != null && searchService.isConfigured;
+    const { searchService } = crowi;
+    return searchService.isConfigured;
   };
 
   locals.isHackmdSetup = function() {