"use strict"; /* * Chatroom Controller * * Server API * message:append - New message to be added to history * message:refresh - Reload all messages * * Client API * message:new - New message has been created * message:refresh - Retrieve most recent messages * message:delete - Deletes message by ID (Admin only) * */ var mongoose = require("mongoose"); var Message = mongoose.model("Message"); var winston = require("winston"); module.exports = namespace => { var broadcastUpdate = message => { namespace.emit("message:append", { messages: [message.toJson()]}); }; var refreshMessages = socket => { Message.list({}, (error, messages) => { if (error) { winston.error("Unable to retrieve messages. Error:", error); return; } var receiver = (socket === undefined) ? namespace : socket; receiver.emit("message:refresh", { messages: messages }); }); }; var retrievePreviousMessages = (options, socket) => { Message.list({ before: options.before }, (error, messages) => { if (error) { winston.error("Unable to retrieve messages. Error:", error); return; } socket.emit("message:append", { messages: messages.map(message => message.toJson()) }); }); } namespace.on('connection', socket => { socket.on('message:new', data => { Message.create({ author: { username: socket._user.username, avatar: socket._user.avatar }, content: data.content.slice(0,255) }, (error, newMessage) => { if (error) { winston.error("Unable to store message. Error:", error); return; } winston.info("New Message", JSON.stringify(newMessage)); broadcastUpdate(newMessage); }); }); socket.on('message:delete', data => { var id = data.id; if (id === undefined || !socket._user.isChatAdmin()) return; Message.update({_id: id}, {deleted: true}, (error, message) => { if (error) { winston.error("An error occurred when trying to delete message:", error); return; } winston.info("Deleted message", JSON.stringify(data)); refreshMessages(); }); }); socket.on('message:refresh', data => { if (data && data.before) { return retrievePreviousMessages(data, socket); } refreshMessages(socket); }); }); };