nodeclub/controllers/message.js
2013-02-19 10:47:29 +08:00

227 lines
6.4 KiB
JavaScript
Raw 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'),
Message = models.Message;
var user_ctrl = require('./user');
var mail_ctrl = require('./mail');
var topic_ctrl = require('./topic');
var EventProxy = require('eventproxy');
exports.index = function (req, res, next) {
if (!req.session.user) {
res.redirect('home');
return;
}
var message_ids = [];
var user_id = req.session.user._id;
Message.find({master_id: user_id}, [], {sort: [['create_at', 'desc']]}, function (err, docs) {
if (err) {
return next(err);
}
for (var i = 0; i < docs.length; i++) {
message_ids.push(docs[i]._id);
}
var messages = [];
if (message_ids.length === 0) {
res.render('message/index', {has_read_messages: [], hasnot_read_messages: []});
return;
}
var proxy = new EventProxy();
var render = function () {
var has_read_messages = [];
var hasnot_read_messages = [];
for (var i = 0; i < messages.length; i++) {
if (messages[i].is_invalid) {
messages[i].remove();
} else {
if (messages[i].has_read) {
has_read_messages.push(messages[i]);
} else {
hasnot_read_messages.push(messages[i]);
}
}
}
res.render('message/index', {has_read_messages: has_read_messages, hasnot_read_messages: hasnot_read_messages});
return;
};
proxy.after('message_ready', message_ids.length, render);
for (var i = 0; i < message_ids.length; i++) {
(function (i) {
get_message_by_id(message_ids[i], function (err, message) {
if (err) {
return next(err);
}
messages[i] = message;
proxy.trigger('message_ready');
});
}(i));
}
});
};
exports.mark_read = function (req, res, next) {
if (!req.session || !req.session.user) {
res.send('forbidden!');
return;
}
var message_id = req.body.message_id;
Message.findOne({_id: message_id}, function (err, message) {
if (err) {
return next(err);
}
if (!message) {
res.json({status: 'failed'});
return;
}
if (message.master_id.toString() !== req.session.user._id.toString()) {
res.json({status: 'failed'});
return;
}
message.has_read = true;
message.save(function (err) {
if (err) {
return next(err);
}
res.json({status: 'success'});
});
});
};
exports.mark_all_read = function (req, res, next) {
if (!req.session || !req.session.user) {
res.send('forbidden!');
return;
}
// TODO: 直接做update无需查找然后再逐个修改。
Message.find({master_id: req.session.user._id, has_read: false}, function (err, messages) {
if (messages.length === 0) {
res.json({'status': 'success'});
return;
}
var proxy = new EventProxy();
var done = function () {
res.json({'status': 'success'});
};
proxy.after('marked', messages.length, done);
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
message.has_read = true;
message.save(function (err) {
proxy.trigger('marked');
});
}
});
};
function send_reply_message(master_id, author_id, topic_id) {
var message = new Message();
message.type = 'reply';
message.master_id = master_id;
message.author_id = author_id;
message.topic_id = topic_id;
message.save(function (err) {
user_ctrl.get_user_by_id(master_id, function (err, master) {
if (master && master.receive_reply_mail) {
message.has_read = true;
message.save();
get_message_by_id(message._id, function (err, msg) {
mail_ctrl.send_reply_mail(master.email, msg);
});
}
});
});
}
function send_reply2_message(master_id, author_id, topic_id) {
var message = new Message();
message.type = 'reply2';
message.master_id = master_id;
message.author_id = author_id;
message.topic_id = topic_id;
message.save(function (err) {
user_ctrl.get_user_by_id(master_id, function (err, master) {
if (master && master.receive_reply_mail) {
message.has_read = true;
message.save();
get_message_by_id(message._id, function (err, msg) {
mail_ctrl.send_reply_mail(master.email, msg);
});
}
});
});
}
function send_at_message(master_id, author_id, topic_id, callback) {
var message = new Message();
message.type = 'at';
message.master_id = master_id;
message.author_id = author_id;
message.topic_id = topic_id;
message.save(function (err) {
user_ctrl.get_user_by_id(master_id, function (err, master) {
if (master && master.receive_at_mail) {
message.has_read = true;
message.save();
get_message_by_id(message._id, function (err, msg) {
mail_ctrl.send_at_mail(master.email, msg);
});
}
});
callback(err);
});
}
function send_follow_message(follow_id, author_id) {
var message = new Message();
message.type = 'follow';
message.master_id = follow_id;
message.author_id = author_id;
message.save();
}
function get_message_by_id(id, cb) {
Message.findOne({_id: id}, function (err, message) {
if (err) {
return cb(err);
}
if (message.type === 'reply' || message.type === 'reply2' || message.type === 'at') {
var proxy = new EventProxy();
var done = function (author, topic) {
message.author = author;
message.topic = topic;
if (!author || !topic) {
message.is_invalid = true;
}
return cb(null, message);
};
proxy.assign('author_found', 'topic_found', done);
proxy.fail(cb);
user_ctrl.get_user_by_id(message.author_id, proxy.done('author_found'));
topic_ctrl.get_topic_by_id(message.topic_id, proxy.done('topic_found'));
}
if (message.type === 'follow') {
user_ctrl.get_user_by_id(message.author_id, function (err, author) {
if (err) {
return cb(err);
}
message.author = author;
if (!author) {
message.is_invalid = true;
}
return cb(null, message);
});
}
});
}
function get_messages_count(master_id, callback) {
Message.count({master_id: master_id, has_read: false}, callback);
}
exports.get_messages_count = get_messages_count;
exports.send_reply_message = send_reply_message;
exports.send_reply2_message = send_reply2_message;
exports.send_follow_message = send_follow_message;
exports.send_at_message = send_at_message;