ChatController.mjs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { expressify } from '@overleaf/promise-utils'
  2. import Modules from '../../infrastructure/Modules.mjs'
  3. import ChatApiHandler from './ChatApiHandler.mjs'
  4. import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
  5. import SessionManager from '../Authentication/SessionManager.mjs'
  6. import UserInfoManager from '../User/UserInfoManager.mjs'
  7. import UserInfoController from '../User/UserInfoController.mjs'
  8. import ChatManager from './ChatManager.mjs'
  9. async function sendMessage(req, res) {
  10. const { project_id: projectId } = req.params
  11. const { content, client_id: clientId } = req.body
  12. const userId = SessionManager.getLoggedInUserId(req.session)
  13. if (userId == null) {
  14. throw new Error('no logged-in user')
  15. }
  16. const message = await ChatApiHandler.promises.sendGlobalMessage(
  17. projectId,
  18. userId,
  19. content
  20. )
  21. const user = await UserInfoManager.promises.getPersonalInfo(message.user_id)
  22. message.user = UserInfoController.formatPersonalInfo(user)
  23. message.clientId = clientId
  24. EditorRealTimeController.emitToRoom(projectId, 'new-chat-message', message)
  25. await Modules.promises.hooks.fire('chatMessageSent', {
  26. projectId,
  27. userId,
  28. messageId: message.id,
  29. })
  30. res.sendStatus(204)
  31. }
  32. async function getMessages(req, res) {
  33. const { project_id: projectId } = req.params
  34. const { query } = req
  35. const messages = await ChatApiHandler.promises.getGlobalMessages(
  36. projectId,
  37. query.limit,
  38. query.before
  39. )
  40. await ChatManager.promises.injectUserInfoIntoThreads({ global: { messages } })
  41. res.json(messages)
  42. }
  43. async function deleteMessage(req, res) {
  44. const { project_id: projectId, message_id: messageId } = req.params
  45. const userId = SessionManager.getLoggedInUserId(req.session)
  46. if (userId == null) {
  47. throw new Error('no logged-in user')
  48. }
  49. await ChatApiHandler.promises.deleteGlobalMessage(projectId, messageId)
  50. EditorRealTimeController.emitToRoom(projectId, 'delete-global-message', {
  51. messageId,
  52. userId,
  53. })
  54. res.sendStatus(204)
  55. }
  56. async function editMessage(req, res, next) {
  57. const { project_id: projectId, message_id: messageId } = req.params
  58. const { content } = req.body
  59. const userId = SessionManager.getLoggedInUserId(req.session)
  60. if (userId == null) {
  61. throw new Error('no logged-in user')
  62. }
  63. await ChatApiHandler.promises.editGlobalMessage(
  64. projectId,
  65. messageId,
  66. userId,
  67. content
  68. )
  69. EditorRealTimeController.emitToRoom(projectId, 'edit-global-message', {
  70. messageId,
  71. userId,
  72. content,
  73. })
  74. res.sendStatus(204)
  75. }
  76. export default {
  77. sendMessage: expressify(sendMessage),
  78. getMessages: expressify(getMessages),
  79. deleteMessage: expressify(deleteMessage),
  80. editMessage: expressify(editMessage),
  81. }