overleaf/services/web/app/coffee/Features/Chat/ChatController.coffee

65 lines
2.5 KiB
CoffeeScript
Raw Normal View History

2016-12-16 11:42:41 -05:00
ChatApiHandler = require("./ChatApiHandler")
EditorRealTimeController = require("../Editor/EditorRealTimeController")
2014-07-04 08:29:59 -04:00
logger = require("logger-sharelatex")
2016-09-05 10:58:31 -04:00
AuthenticationController = require('../Authentication/AuthenticationController')
2017-01-06 07:41:58 -05:00
UserInfoManager = require('../User/UserInfoManager')
UserInfoController = require('../User/UserInfoController')
async = require "async"
2014-07-04 08:05:55 -04:00
module.exports = ChatController =
2016-09-05 10:58:31 -04:00
sendMessage: (req, res, next)->
2016-12-16 11:42:41 -05:00
project_id = req.params.project_id
content = req.body.content
2016-09-05 10:58:31 -04:00
user_id = AuthenticationController.getLoggedInUserId(req)
if !user_id?
err = new Error('no logged-in user')
return next(err)
2016-12-16 11:42:41 -05:00
ChatApiHandler.sendGlobalMessage project_id, user_id, content, (err, message) ->
return next(err) if err?
2017-01-06 07:41:58 -05:00
UserInfoManager.getPersonalInfo message.user_id, (err, user) ->
return next(err) if err?
message.user = UserInfoController.formatPersonalInfo(user)
EditorRealTimeController.emitToRoom project_id, "new-chat-message", message
2017-01-06 07:41:58 -05:00
res.send(204)
2014-07-04 08:05:55 -04:00
2016-12-16 11:42:41 -05:00
getMessages: (req, res, next)->
project_id = req.params.project_id
2014-07-15 13:25:12 -04:00
query = req.query
logger.log project_id:project_id, query:query, "getting messages"
2016-12-16 11:42:41 -05:00
ChatApiHandler.getGlobalMessages project_id, query.limit, query.before, (err, messages) ->
return next(err) if err?
ChatController._injectUserInfoIntoThreads {global: { messages: messages }}, (err) ->
2017-01-06 07:41:58 -05:00
return next(err) if err?
logger.log length: messages?.length, "sending messages to client"
res.json messages
_injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) ->
# There will be a lot of repitition of user_ids, so first build a list
# of unique ones to perform db look ups on, then use these to populate the
# user fields
user_ids = {}
for thread_id, thread of threads
if thread.resolved
user_ids[thread.resolved_by_user_id] = true
for message in thread.messages
user_ids[message.user_id] = true
jobs = []
users = {}
for user_id, _ of user_ids
do (user_id) ->
jobs.push (cb) ->
UserInfoManager.getPersonalInfo user_id, (err, user) ->
return cb(error) if error?
user = UserInfoController.formatPersonalInfo user
users[user_id] = user
cb()
async.series jobs, (error) ->
return callback(error) if error?
for thread_id, thread of threads
if thread.resolved
thread.resolved_by_user = users[thread.resolved_by_user_id]
for message in thread.messages
message.user = users[message.user_id]
return callback null, threads