Sotaro KARASAWA 10 лет назад
Родитель
Сommit
d36b6c5bc7
3 измененных файлов с 65 добавлено и 4 удалено
  1. 5 3
      lib/models/page.js
  2. 3 1
      lib/routes/index.js
  3. 57 0
      lib/routes/search.js

+ 5 - 3
lib/models/page.js

@@ -442,11 +442,13 @@ module.exports = function(crowi) {
     });
   };
 
-  pageSchema.statics.findListByPageIds = function(ids, option) {
+  pageSchema.statics.findListByPageIds = function(ids, options) {
     var Page = this;
     var User = crowi.model('User');
-    var limit = option.limit || 50;
-    var offset = option.skip || 0;
+    var options = options || {}
+      , limit = options.limit || 50
+      , offset = options.skip || 0
+      ;
 
     return new Promise(function(resolve, reject) {
       Page

+ 3 - 1
lib/routes/index.js

@@ -12,6 +12,7 @@ module.exports = function(crowi, app) {
     , comment   = require('./comment')(crowi, app)
     , bookmark  = require('./bookmark')(crowi, app)
     , revision  = require('./revision')(crowi, app)
+    , search    = require('./search')(crowi, app)
     , loginRequired = middleware.loginRequired
     , accessTokenParser = middleware.accessTokenParser
     ;
@@ -74,7 +75,8 @@ module.exports = function(crowi, app) {
   app.get( '/:id([0-9a-z]{24})'       , loginRequired(crowi, app) , page.api.redirector);
   app.get( '/_r/:id([0-9a-z]{24})'    , loginRequired(crowi, app) , page.api.redirector); // alias
 
-  app.get( '/_search'                 , loginRequired(crowi, app) , page.search);
+  app.get( '/_search'                 , loginRequired(crowi, app) , search.searchPage);
+  app.get( '/_api/search'             , accessTokenParser(crowi, app) , loginRequired(crowi, app) , search.api.search);
 
   app.get( '/_api/check_username'     , user.api.checkUsername);
   app.post('/_api/me/picture/upload'  , loginRequired(crowi, app) , me.api.uploadPicture);

+ 57 - 0
lib/routes/search.js

@@ -0,0 +1,57 @@
+module.exports = function(crowi, app) {
+  'use strict';
+
+  var debug = require('debug')('crowi:routes:search')
+    , Page = crowi.model('Page')
+    , User = crowi.model('User')
+    , ApiResponse = require('../util/apiResponse')
+
+    , sprintf = require('sprintf')
+
+    , actions = {};
+  var api = actions.api = {};
+
+  actions.searchPage = function(req, res) {
+    var search = crowi.getSearcher();
+    if (!search) {
+      return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
+    }
+  };
+
+  /**
+   * @api {get} /search search page
+   * @apiName Search
+   * @apiGroup Search
+   *
+   * @apiParam {String} q keyword
+   * @apiParam {String} path
+   */
+  api.search = function(req, res){
+    var keyword = req.query.q || null;
+    if (keyword === null || keyword === '') {
+      return res.json(ApiResponse.error('keyword should not empty.'));
+    }
+
+    var search = crowi.getSearcher();
+    if (!search) {
+      return res.json(ApiResponse.error('Configuration of ELASTICSEARCH_URI is required.'));
+    }
+
+    var result = {};
+    search.searchKeyword(keyword, {})
+      .then(function(data) {
+        result.meta = data.meta;
+
+        return Page.populatePageListToAnyObjects(data.data);
+      }).then(function(pages) {
+        result.data = pages;
+        return res.json(ApiResponse.success(result));
+      })
+      .catch(function(err) {
+        return res.json(ApiResponse.error(err));
+      });
+  };
+
+
+  return actions;
+};