mirror of
https://github.com/cnodejs/nodeclub.git
synced 2025-12-08 19:55:55 +00:00
150 lines
3.9 KiB
JavaScript
150 lines
3.9 KiB
JavaScript
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);
|
||
};
|