pinclub/pinclub

View on GitHub
api/v1/reply.js

Summary

Maintainability
C
1 day
Test Coverage
var EventProxy = require('eventproxy');
var validator  = require('validator');
var Topic      = require('../../proxy').Topic;
var User       = require('../../proxy').User;
var Reply      = require('../../proxy').Reply;
var at         = require('../../common/at');
var message    = require('../../common/message');
var config     = require('../../config');

var create = function (req, res, next) {
  var topic = req.params.topic;
  var content  = req.body.content || '';
  var reply_id = req.body.reply_id;

  var ep = new EventProxy();
  ep.fail(next);

  var str = validator.trim(content);
  if (str === '') {
    res.status(400);
    return res.send({success: false, error_msg: '回复内容不能为空'});
  }

  if (!validator.isMongoId(topic)) {
    res.status(400);
    return res.send({success: false, error_msg: '不是有效的话题id'});
  }
  
  Topic.getTopic(topic, ep.done(function (topic) {
    if (!topic) {
      res.status(404);
      return res.send({success: false, error_msg: '话题不存在'});
    }
    if (topic.lock) {
      res.status(403);
      return res.send({success: false, error_msg: '该话题已被锁定'});
    }
    ep.emit('topic', topic);
  }));

  ep.all('topic', function (topic) {
    User.getUserById(topic.author, ep.done('topic_author'));
  });

  ep.all('topic', 'topic_author', function (topic, topicAuthor) {
    Reply.newAndSave(content, topic, req.user.id, reply_id, ep.done(function (reply) {
      Topic.updateLastReply(topic, reply._id, ep.done(function () {
        ep.emit('reply_saved', reply);
        //发送at消息,并防止重复 at 作者
        var newContent = content.replace('@' + topicAuthor.loginname + ' ', '');
        at.sendMessageToMentionUsers(newContent, topic, req.user.id, reply._id);
      }));
    }));

    User.getUserById(req.user.id, ep.done(function (user) {
      user.score += 5;
      user.reply_count += 1;
      user.save();
      ep.emit('score_saved');
    }));
  });

  ep.all('reply_saved', 'topic', function (reply, topic) {
    if (topic.author.toString() !== req.user.id.toString()) {
      message.sendReplyMessage(topic.author, req.user.id, topic._id, reply._id);
    }
    ep.emit('message_saved');
  });

  ep.all('reply_saved', 'message_saved', 'score_saved', function (reply) {
    res.send({
      success: true,
      reply_id: reply._id
    });
  });
};

exports.create = create;

var ups = function (req, res, next) {
  var replyId = req.params.reply_id;
  var userId  = req.user.id;

  if (!validator.isMongoId(replyId)) {
    res.status(400);
    return res.send({success: false, error_msg: '不是有效的评论id'});
  }
  
  Reply.getReplyById(replyId, function (err, reply) {
    if (err) {
      return next(err);
    }
    if (!reply) {
      res.status(404);
      return res.send({success: false, error_msg: '评论不存在'});
    }
    if (reply.author.equals(userId) && !config.debug) {
      res.status(403);
      return res.send({success: false, error_msg: '不能帮自己点赞'});
    } else {
      var action;
      reply.ups = reply.ups || [];
      var upIndex = reply.ups.indexOf(userId);
      if (upIndex === -1) {
        reply.ups.push(userId);
        action = 'up';
      } else {
        reply.ups.splice(upIndex, 1);
        action = 'down';
      }
      reply.save(function () {
        res.send({
          success: true,
          action: action
        });
      });
    }
  });
};

exports.ups = ups;