AdminController.mjs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import logger from '@overleaf/logger'
  2. import http from 'node:http'
  3. import https from 'node:https'
  4. import Settings from '@overleaf/settings'
  5. import TpdsUpdateSender from '../ThirdPartyDataStore/TpdsUpdateSender.js'
  6. import TpdsProjectFlusher from '../ThirdPartyDataStore/TpdsProjectFlusher.js'
  7. import EditorRealTimeController from '../Editor/EditorRealTimeController.js'
  8. import SystemMessageManager from '../SystemMessages/SystemMessageManager.js'
  9. const AdminController = {
  10. _sendDisconnectAllUsersMessage: delay => {
  11. return EditorRealTimeController.emitToAll(
  12. 'forceDisconnect',
  13. 'Sorry, we are performing a quick update to the editor and need to close it down. Please refresh the page to continue.',
  14. delay
  15. )
  16. },
  17. index: (req, res, next) => {
  18. let url
  19. const openSockets = {}
  20. for (url in http.globalAgent.sockets) {
  21. openSockets[`http://${url}`] = http.globalAgent.sockets[url].map(
  22. socket => socket._httpMessage.path
  23. )
  24. }
  25. for (url in https.globalAgent.sockets) {
  26. openSockets[`https://${url}`] = https.globalAgent.sockets[url].map(
  27. socket => socket._httpMessage.path
  28. )
  29. }
  30. SystemMessageManager.getMessagesFromDB(function (error, systemMessages) {
  31. if (error) {
  32. return next(error)
  33. }
  34. res.render('admin/index', {
  35. title: 'System Admin',
  36. openSockets,
  37. systemMessages,
  38. })
  39. })
  40. },
  41. disconnectAllUsers: (req, res) => {
  42. logger.warn('disconecting everyone')
  43. const delay = (req.query && req.query.delay) > 0 ? req.query.delay : 10
  44. AdminController._sendDisconnectAllUsersMessage(delay)
  45. res.redirect('/admin#open-close-editor')
  46. },
  47. openEditor(req, res) {
  48. logger.warn('opening editor')
  49. Settings.editorIsOpen = true
  50. res.redirect('/admin#open-close-editor')
  51. },
  52. closeEditor(req, res) {
  53. logger.warn('closing editor')
  54. Settings.editorIsOpen = req.body.isOpen
  55. res.redirect('/admin#open-close-editor')
  56. },
  57. flushProjectToTpds(req, res, next) {
  58. TpdsProjectFlusher.flushProjectToTpds(req.body.project_id, error => {
  59. if (error) {
  60. return next(error)
  61. }
  62. res.sendStatus(200)
  63. })
  64. },
  65. pollDropboxForUser(req, res) {
  66. const { user_id: userId } = req.body
  67. TpdsUpdateSender.pollDropboxForUser(userId, () => res.sendStatus(200))
  68. },
  69. createMessage(req, res, next) {
  70. SystemMessageManager.createMessage(req.body.content, function (error) {
  71. if (error) {
  72. return next(error)
  73. }
  74. res.redirect('/admin#system-messages')
  75. })
  76. },
  77. clearMessages(req, res, next) {
  78. SystemMessageManager.clearMessages(function (error) {
  79. if (error) {
  80. return next(error)
  81. }
  82. res.redirect('/admin#system-messages')
  83. })
  84. },
  85. }
  86. export default AdminController