Sotaro KARASAWA 10 лет назад
Родитель
Сommit
409360bd48

+ 1 - 1
lib/models/bookmark.js

@@ -39,7 +39,7 @@ module.exports = function(crowi) {
       .skip(offset)
       .limit(limit)
       .exec(function(err, bookmarks) {
-        debug ('bookmarks', bookmarks);
+        //debug ('bookmarks', bookmarks);
         callback(err, bookmarks);
       });
   };

+ 1 - 1
lib/models/comment.js

@@ -57,7 +57,7 @@ module.exports = function(crowi) {
             return resolve([]);
           }
 
-          debug('Comment loaded', data);
+          //debug('Comment loaded', data);
           return resolve(data);
         });
     });

+ 17 - 11
lib/models/page.js

@@ -161,23 +161,29 @@ module.exports = function(crowi) {
     });
   };
 
-  pageSchema.methods.seen = function(userData, callback) {
+  pageSchema.methods.seen = function(userData) {
     var self = this,
       Page = self;
 
-    if (!userData || !userData._id) {
-      callback(new Error('User data is not valid'), null);
-    }
-
     if (this.isSeenUser(userData)) {
       debug('seenUsers not updated');
-      return callback(null, self);
+      return Promise.resolve(this);
     }
 
-    var added = self.seenUsers.addToSet(userData);
-    this.save(function(err, data) {
-      debug('seenUsers updated!', added);
-      return callback(err, self);
+    return new Promise(function(resolve, reject) {
+      if (!userData || !userData._id) {
+        reject(new Error('User data is not valid'));
+      }
+
+      var added = self.seenUsers.addToSet(userData);
+      self.save(function(err, data) {
+        if (err) {
+          return reject(err);
+        }
+
+        debug('seenUsers updated!', added);
+        return resolve(self);
+      });
     });
   };
 
@@ -275,7 +281,7 @@ module.exports = function(crowi) {
           return reject(err);
         }
 
-        populatePageData(pageData, null).then(resolve).catch(reject);
+        return populatePageData(pageData, null).then(resolve);
       });
     });
   };

+ 1 - 0
lib/routes/index.js

@@ -77,6 +77,7 @@ module.exports = function(crowi, app) {
 
   // HTTP RPC Styled API (に徐々に移行していいこうと思う)
   app.get('/_api/pages.get'           , accessTokenParser(crowi, app) , loginRequired(crowi, app) , page.api.get);
+  app.post('/_api/pages.seen'         , accessTokenParser(crowi, app) , loginRequired(crowi, app) , page.api.seen);
   app.get('/_api/comments.get'        , accessTokenParser(crowi, app) , loginRequired(crowi, app) , comment.api.get);
   app.post('/_api/comments.add'       , form.comment, accessTokenParser(crowi, app) , loginRequired(crowi, app) , comment.api.add);
   app.get( '/_api/bookmarks.get'      , accessTokenParser(crowi, app) , loginRequired(crowi, app) , bookmark.api.get);

+ 43 - 14
lib/routes/page.js

@@ -217,25 +217,54 @@ module.exports = function(crowi, app) {
   };
 
   /**
-   * @api pages.get
-   * @param page /page/path
-   * @param page_id XXXXX
+   * @api {get} /pages.get Post comment for the page
+   * @apiName GetPage
+   * @apiGroup Page
+   *
+   * @apiParam {String} page_id
+   * @apiParam {String} path
+   * @apiParam {String} revision_id
    */
   api.get = function(req, res){
-    var pagePath = req.query.page;
-    var revision = req.query.revision;
-    var options = {};
+    var pagePath = req.query.path || null;
+    var pageId = req.query.page_id || null; // TODO: handling
+    var revisionId = req.query.revision_id || null;
 
-    Page.findPage(pagePath, req.user, revision, options, function(err, pageData) {
+    Page.findPage(pagePath, req.user, revisionId)
+    .then(function(pageData) {
       var result = {};
-      if (err) {
-        result = ApiResponse.error(err);
-      }
-      if (pageData) {
-        result = ApiResponse.success(pageData);
-      }
+      result.page = pageData;
+
+      return res.json(ApiResponse.success(pageData));
+    }).catch(function(err) {
+      return res.json(ApiResponse.error(err));
+    });
+  };
 
-      return res.json(result);
+  /**
+   * @api {post} /pages.seen Mark as seen user
+   * @apiName SeenPage
+   * @apiGroup Page
+   *
+   * @apiParam {String} page_id Page Id.
+   */
+  api.seen = function(req, res){
+    var pageId = req.body.page_id;
+    if (!pageId) {
+      return res.json(ApiResponse.error('page_id required'));
+    }
+
+    Page.findPageByIdAndGrantedUser(pageId, req.user)
+    .then(function(page) {
+      return page.seen(req.user);
+    }).then(function(user) {
+      var result = {};
+      result.seenUser = user;
+
+      return res.json(ApiResponse.success(result));
+    }).catch(function(err) {
+      debug('Seen user update error', err);
+      return res.json(ApiResponse.error(err));
     });
   };
 

+ 1 - 0
lib/views/page.html

@@ -34,6 +34,7 @@
   data-current-user="{% if user %}{{ user._id.toString() }}{% endif %}"
   data-page-revision-id="{% if revision %}{{ revision._id.toString() }}{% endif %}"
   data-page-revision-created="{% if revision %}{{ revision.createdAt|datetz('U') }}{% endif %}"
+  data-page-is-seen="{% if page and page.isSeenUser(user) %}1{% else %}0{% endif %}"
   >
 
   {% if not page %}

+ 1 - 0
lib/views/page_list.html

@@ -42,6 +42,7 @@
   data-current-user="{% if user %}{{ user._id.toString() }}{% endif %}"
   data-page-revision-id="{% if revision %}{{ revision._id.toString() }}{% endif %}"
   data-page-revision-created="{% if revision %}{{ revision.createdAt|datetz('U') }}{% endif %}"
+  data-page-is-seen="{% if page and page.isSeenUser(user) %}1{% else %}0{% endif %}"
   >
 
 <div class="portal">

+ 11 - 0
resource/js/crowi.js

@@ -220,6 +220,7 @@ $(function() {
   var revisionId = $('#content-main').data('page-revision-id');
   var revisionCreatedAt = $('#content-main').data('page-revision-created');
   var currentUser = $('#content-main').data('current-user');
+  var isSeen = $('#content-main').data('page-is-seen');
 
   Crowi.linkPath();
 
@@ -448,5 +449,15 @@ $(function() {
       $bookmarkButton.data('bookmarked', 0);
     }
   }
+
+  if (!isSeen) {
+    $.post('/_api/pages.seen', {page_id: pageId}, function(res) {
+      // ignore unless response has error
+      console.log(pageId, res);
+      if (res.ok && res.seenUser) {
+        $('#content-main').data('page-is-seen', 1);
+      }
+    });
+  }
 });