Sotaro KARASAWA 10 лет назад
Родитель
Сommit
3e608d61a0
4 измененных файлов с 63 добавлено и 2 удалено
  1. 26 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

+ 26 - 1
lib/models/page.js

@@ -404,7 +404,10 @@ module.exports = function(crowi) {
         //.sort({createdAt: -1}) // TODO optionize
         .skip(offset)
         .limit(limit)
-        .populate('revision')
+        .populate([
+          {path: 'creator', model: 'User'},
+          {path: 'revision', model: 'Revision'},
+        ])
         .exec(function(err, pages) {
           if (err) {
             return reject(err);
@@ -448,6 +451,28 @@ module.exports = function(crowi) {
           });
         });
     });
+
+  /**
+   * 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, option) {

+ 3 - 0
lib/routes/index.js

@@ -65,6 +65,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

@@ -96,6 +96,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

@@ -21,7 +21,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">