const { expressify } = require('@overleaf/promise-utils') const Modules = require('../../infrastructure/Modules') const ChatApiHandler = require('./ChatApiHandler') const EditorRealTimeController = require('../Editor/EditorRealTimeController') const SessionManager = require('../Authentication/SessionManager') const UserInfoManager = require('../User/UserInfoManager') const UserInfoController = require('../User/UserInfoController') const ChatManager = require('./ChatManager') async function sendMessage(req, res) { const { project_id: projectId } = req.params const { content, client_id: clientId } = req.body const userId = SessionManager.getLoggedInUserId(req.session) if (userId == null) { throw new Error('no logged-in user') } const message = await ChatApiHandler.promises.sendGlobalMessage( projectId, userId, content ) const user = await UserInfoManager.promises.getPersonalInfo(message.user_id) message.user = UserInfoController.formatPersonalInfo(user) message.clientId = clientId EditorRealTimeController.emitToRoom(projectId, 'new-chat-message', message) await Modules.promises.hooks.fire('chatMessageSent', { projectId, userId, messageId: message.id, }) res.sendStatus(204) } async function getMessages(req, res) { const { project_id: projectId } = req.params const { query } = req const messages = await ChatApiHandler.promises.getGlobalMessages( projectId, query.limit, query.before ) await ChatManager.promises.injectUserInfoIntoThreads({ global: { messages } }) res.json(messages) } module.exports = { sendMessage: expressify(sendMessage), getMessages: expressify(getMessages), }