nodeclub/proxy/reply.js
2018-11-01 20:51:45 +08:00

150 lines
3.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var models = require('../models');
var Reply = models.Reply;
var EventProxy = require('eventproxy');
var tools = require('../common/tools');
var User = require('./user');
var at = require('../common/at');
/**
* 获取一条回复信息
* @param {String} id 回复ID
* @param {Function} callback 回调函数
*/
exports.getReply = function (id, callback) {
Reply.findOne({_id: id}, callback);
};
/**
* 根据回复ID获取回复
* Callback:
* - err, 数据库异常
* - reply, 回复内容
* @param {String} id 回复ID
* @param {Function} callback 回调函数
*/
exports.getReplyById = function (id, callback) {
if (!id) {
return callback(null, null);
}
Reply.findOne({_id: id}, function (err, reply) {
if (err) {
return callback(err);
}
if (!reply) {
return callback(err, null);
}
var author_id = reply.author_id;
User.getUserById(author_id, function (err, author) {
if (err) {
return callback(err);
}
reply.author = author;
// TODO: 添加更新方法有些旧帖子可以转换为markdown格式的内容
if (reply.content_is_html) {
return callback(null, reply);
}
at.linkUsers(reply.content, function (err, str) {
if (err) {
return callback(err);
}
reply.content = str;
return callback(err, reply);
});
});
});
};
/**
* 根据主题ID获取回复列表
* Callback:
* - err, 数据库异常
* - replies, 回复列表
* @param {String} id 主题ID
* @param {Function} callback 回调函数
*/
exports.getRepliesByTopicId = function (id, cb) {
Reply.find({topic_id: id, deleted: false}, '', {sort: 'create_at'}, function (err, replies) {
if (err) {
return cb(err);
}
if (replies.length === 0) {
return cb(null, []);
}
var proxy = new EventProxy();
proxy.after('reply_find', replies.length, function () {
cb(null, replies);
});
for (var j = 0; j < replies.length; j++) {
(function (i) {
var author_id = replies[i].author_id;
User.getUserById(author_id, function (err, author) {
if (err) {
return cb(err);
}
replies[i].author = author || { _id: '' };
if (replies[i].content_is_html) {
return proxy.emit('reply_find');
}
at.linkUsers(replies[i].content, function (err, str) {
if (err) {
return cb(err);
}
replies[i].content = str;
proxy.emit('reply_find');
});
});
})(j);
}
});
};
/**
* 创建并保存一条回复信息
* @param {String} content 回复内容
* @param {String} topicId 主题ID
* @param {String} authorId 回复作者
* @param {String} [replyId] 回复ID当二级回复时设定该值
* @param {Function} callback 回调函数
*/
exports.newAndSave = function (content, topicId, authorId, replyId, callback) {
if (typeof replyId === 'function') {
callback = replyId;
replyId = null;
}
var reply = new Reply();
reply.content = content;
reply.topic_id = topicId;
reply.author_id = authorId;
if (replyId) {
reply.reply_id = replyId;
}
reply.save(function (err) {
callback(err, reply);
});
};
/**
* 根据topicId查询到最新的一条未删除回复
* @param topicId 主题ID
* @param callback 回调函数
*/
exports.getLastReplyByTopId = function (topicId, callback) {
Reply.find({topic_id: topicId, deleted: false}, '_id', {sort: {create_at : -1}, limit : 1}, callback);
};
exports.getRepliesByAuthorId = function (authorId, opt, callback) {
if (!callback) {
callback = opt;
opt = null;
}
Reply.find({author_id: authorId}, {}, opt, callback);
};
// 通过 author_id 获取回复总数
exports.getCountByAuthorId = function (authorId, callback) {
Reply.countDocuments({author_id: authorId}, callback);
};