Răsfoiți Sursa

Add users.list api and seenUser, liker fix

Sotaro KARASAWA 10 ani în urmă
părinte
comite
2dfb81a9f2

+ 25 - 0
lib/models/user.js

@@ -254,6 +254,7 @@ module.exports = function(crowi) {
 
   userSchema.statics.findUsers = function(options, callback) {
     var sort = options.sort || {status: 1, createdAt: 1};
+
     this.find()
       .sort(sort)
       .skip(options.skip || 0)
@@ -264,6 +265,30 @@ module.exports = function(crowi) {
 
   };
 
+  userSchema.statics.findUsersByIds = function(ids, option) {
+    var User = this;
+    var option = option || {}
+      , sort = option.sort || {createdAt: -1}
+      , status = option.status || STATUS_ACTIVE
+      , fields = option.fields || USER_PUBLIC_FIELDS
+      ;
+
+
+    return new Promise(function(resolve, reject) {
+      User
+        .find({ _id: { $in: ids }, status: status })
+        .select(fields)
+        .sort(sort)
+        .exec(function (err, userData) {
+          if (err) {
+            return reject(err);
+          }
+
+          return resolve(userData);
+        });
+    });
+  };
+
   userSchema.statics.findAdmins = function(callback) {
     var User = this;
     this.find({admin: true})

+ 1 - 0
lib/routes/index.js

@@ -74,6 +74,7 @@ module.exports = function(crowi, app) {
   app.post('/_api/attachment/:id/remove',loginRequired(crowi, app), attachment.api.remove);
 
   // HTTP RPC Styled API (に徐々に移行していいこうと思う)
+  app.get('/_api/users.list'          , accessTokenParser(crowi, app) , loginRequired(crowi, app) , user.api.list);
   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);

+ 1 - 1
lib/routes/page.js

@@ -275,7 +275,7 @@ module.exports = function(crowi, app) {
   };
 
   /**
-   * @api {get} /pages.get Post comment for the page
+   * @api {get} /pages.get Get page data
    * @apiName GetPage
    * @apiGroup Page
    *

+ 26 - 0
lib/routes/user.js

@@ -5,6 +5,7 @@ module.exports = function(crowi, app) {
     , User = crowi.model('User')
     , Revision = crowi.model('Revision')
     , Bookmark = crowi.model('Bookmark')
+    , ApiResponse = require('../util/apiResponse')
     , actions = {}
     , api = {};
 
@@ -35,5 +36,30 @@ module.exports = function(crowi, app) {
     });
   };
 
+  /**
+   * @api {get} /users.list Get user list
+   * @apiName GetUserList
+   * @apiGroup User
+   *
+   * @apiParam {String} user_ids
+   */
+  api.list = function(req, res) {
+    var userIds = req.query.user_ids || null; // TODO: handling
+    if (!userIds || userIds.split(',').length <= 0) {
+      return res.json(ApiResponse.error('user_ids param is required'));
+    }
+
+    User.findUsersByIds(userIds.split(','))
+    .then(function(userList) {
+      var result = {
+        users: userList,
+      };
+
+      return res.json(ApiResponse.success(result));
+    }).catch(function(err) {
+      return res.json(ApiResponse.error(err));
+    });
+  };
+
   return actions;
 };

+ 6 - 11
lib/views/widget/page_side_header.html

@@ -24,17 +24,12 @@
       <dd>
         <p class="liker-count">
         <span id="like-count">{{ page.liker.length }}</span>
-        <button data-liked="{% if page.isLiked(user) %}1{% else %}0{% endif %}" class="btn btn-default btn-sm" id="like-button"><i class="fa fa-thumbs-o-up"></i> いいね!</button>
+        <button
+          data-liked="{% if page.isLiked(user) %}1{% else %}0{% endif %}"
+          class="btn btn-default btn-sm {% if page.isLiked(user) %}active{% endif %}"
+          id="like-button"><i class="fa fa-thumbs-o-up"></i> いいね!</button>
         </p>
-        <p class="liker-list">
-        {#
-          {% for liker in page.liker %}
-            <a href="{{ user_page_root(liker) }}" title="{{ liker.name }}"><img alt="{{ liker.name }}" src="{{ liker|picture }}" class="picture picture-xs picture-rounded"></a>
-          {% endfor %}
-          {% if page.liker.length > 10 %}
-            (...)
-          {% endif %}
-          #}
+        <p id="liker-list" class="liker-list" data-likers="{{ page.liker|default([])|join(',') }}">
         </p>
       </dd>
 
@@ -43,7 +38,7 @@
         <p class="seen-user-count">
           {{ page.seenUsers.length }}
         </p>
-        <p class="seen-user-list">
+        <p id="seen-user-list" class="seen-user-list" data-seen-users="{{ page.seenUsers|default([])|join(',') }}">
         {#
           {% for seenUser in page.seenUsers %}
           <a href="{{ user_page_root(seenUser) }}" title="{{ seenUser.name }}"><img alt="{{ seenUser.name }}" src="{{ seenUser|picture }}" class="picture picture-xs picture-rounded"></a>

+ 49 - 1
resource/js/crowi.js

@@ -483,6 +483,23 @@ $(function() {
 
       return false;
     });
+    var $likerList = $("#liker-list");
+    var likers = $likerList.data('likers');
+    if (likers && likers.length > 0) {
+      // FIXME: user data cache
+      $.get('/_api/users.list', {user_ids: likers}, function(res) {
+        // ignore unless response has error
+        if (res.ok) {
+          AddToLikers(res.users);
+        }
+      });
+    }
+
+    function AddToLikers (users) {
+      $.each(users, function(i, user) {
+        $likerList.append(CreateUserLinkWithPicture(user));
+      });
+    }
 
     function MarkLiked()
     {
@@ -501,12 +518,43 @@ $(function() {
     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);
         }
       });
     }
+
+    var $seenUserList = $("#seen-user-list");
+    var seenUsers = $seenUserList.data('seen-users');
+    if (seenUsers && seenUsers.length > 0) {
+      // FIXME: user data cache
+      $.get('/_api/users.list', {user_ids: seenUsers}, function(res) {
+        // ignore unless response has error
+        if (res.ok) {
+          AddToSeenUser(res.users);
+        }
+      });
+    }
+
+    function CreateUserLinkWithPicture (user) {
+      var $userHtml = $('<a>');
+      $userHtml.data('user-id', user._id);
+      $userHtml.attr('href', '/user/' + user.username);
+      $userHtml.attr('title', user.name);
+
+      var $userPicture = $('<img class="picture picture-xs picture-rounded">');
+      $userPicture.attr('alt', user.name);
+      $userPicture.attr('src',  Crowi.userPicture(user));
+
+      $userHtml.append($userPicture);
+      return $userHtml;
+    }
+
+    function AddToSeenUser (users) {
+      $.each(users, function(i, user) {
+        $seenUserList.append(CreateUserLinkWithPicture(user));
+      });
+    }
   }
 });