Quellcode durchsuchen

Add search routes

Sotaro KARASAWA vor 10 Jahren
Ursprung
Commit
df850ea0ea
4 geänderte Dateien mit 81 neuen und 2 gelöschten Zeilen
  1. 44 1
      lib/models/page.js
  2. 3 0
      lib/routes/index.js
  3. 30 0
      lib/routes/page.js
  4. 4 1
      lib/views/layout/2column.html

+ 44 - 1
lib/models/page.js

@@ -233,6 +233,29 @@ module.exports = function(crowi) {
     });
   };
 
+  pageSchema.statics.findListByPageIds = function(ids) {
+    var Page = this;
+
+    debug('findPageByIds', ids);
+
+    return new Promise(function(resolve, reject) {
+      Page.find({
+        _id: {$in: ids},
+      }).populate([
+        {path: 'creator', model: 'User'},
+        {path: 'revision', model: 'Revision'},
+      ]).exec(function(err, docs) {
+        debug('findPagesByIds', err, docs);
+
+        if (err) {
+          return reject(err);
+        }
+
+        return resolve(docs);
+      });
+    });
+  };
+
   pageSchema.statics.findPageByIdAndGrantedUser = function(id, userData, cb) {
     var Page = this;
 
@@ -265,7 +288,27 @@ module.exports = function(crowi) {
     });
   };
 
-  pageSchema.statics.findListByPageIds = function(ids, options, cb) {
+  /**
+   * Bulk get (for internal only)
+   */
+  pageSchema.statics.getStreamOfFindAll = function(options) {
+    var Page = this
+      , options = options || {}
+      , publicOnly = options.publicOnly || true
+      , criteria = {redirectTo: null,}
+      ;
+
+    if (publicOnly) {
+      criteria.grant = GRANT_PUBLIC;
+    }
+
+    return this.find(criteria)
+      .populate([
+        {path: 'creator', model: 'User'},
+        {path: 'revision', model: 'Revision'},
+      ])
+      .sort({updatedAt: -1})
+      .stream();
   };
 
   pageSchema.statics.findListByStartWith = function(path, userData, options, cb) {

+ 3 - 0
lib/routes/index.js

@@ -63,6 +63,9 @@ 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( '/_api/check_username'     , user.api.checkUsername);
   app.post('/_api/me/picture/upload'  , loginRequired(crowi, app) , me.api.uploadPicture);
   app.get( '/_api/user/bookmarks'     , loginRequired(crowi, app) , user.api.bookmarks);

+ 30 - 0
lib/routes/page.js

@@ -58,6 +58,36 @@ module.exports = function(crowi, app) {
     });
   };
 
+  actions.search = function(req, res) {
+    // spec: ?q=query&sort=sort_order&author=author_filter
+    var query = req.query.q;
+    var search = require('../util/search')(crowi);
+
+    search.searchPageByKeyword(query)
+    .then(function(pages) {
+      debug('pages', pages);
+
+      if (pages.hits.total <= 0) {
+        return Promise.resolve([]);
+      }
+
+      var ids = pages.hits.hits.map(function(page) {
+        return page._id;
+      });
+
+      return Page.findListByPageIds(ids);
+    }).then(function(pages) {
+
+      res.render('page_list', {
+        path: '/',
+        pages: pages,
+        pager: generatePager({offset: 0, limit: 50})
+      });
+    }).catch(function(err) {
+      debug('search error', err);
+    });
+  };
+
   function renderPage(pageData, req, res) {
     // create page
     if (!pageData) {

+ 4 - 1
lib/views/layout/2column.html

@@ -18,7 +18,10 @@
     <ul class="nav navbar-nav">
       <li class=""><a href="/INDEX">INDEX</a></li>
     </ul>
-    {% include '../widget/searcher.html' %}
+    <form id="headerSearch" class="navbar-form navbar-left form-inline" role="search" action="/_search">
+      <input id="searchQuery" name="q" type="text" class="form-control" placeholder="検索文字...">
+      <button type="submit" class="btn btn-default">検索</button>
+    </form>
 
     <ul class="nav navbar-nav navbar-right">