DocumentController.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. const ProjectGetter = require('../Project/ProjectGetter')
  2. const OError = require('@overleaf/o-error')
  3. const ProjectLocator = require('../Project/ProjectLocator')
  4. const ProjectEntityHandler = require('../Project/ProjectEntityHandler')
  5. const ProjectEntityUpdateHandler = require('../Project/ProjectEntityUpdateHandler')
  6. const logger = require('@overleaf/logger')
  7. const _ = require('lodash')
  8. const { plainTextResponse } = require('../../infrastructure/Response')
  9. function getDocument(req, res, next) {
  10. const { Project_id: projectId, doc_id: docId } = req.params
  11. const plain = req.query.plain === 'true'
  12. const peek = req.query.peek === 'true'
  13. ProjectGetter.getProject(
  14. projectId,
  15. { rootFolder: true, overleaf: true },
  16. (error, project) => {
  17. if (error) {
  18. return next(error)
  19. }
  20. if (!project) {
  21. return res.sendStatus(404)
  22. }
  23. ProjectLocator.findElement(
  24. { project, element_id: docId, type: 'doc' },
  25. (error, doc, path) => {
  26. if (error) {
  27. OError.tag(error, 'error finding element for getDocument', {
  28. docId,
  29. projectId,
  30. })
  31. return next(error)
  32. }
  33. ProjectEntityHandler.getDoc(
  34. projectId,
  35. docId,
  36. { peek },
  37. (error, lines, rev, version, ranges) => {
  38. if (error) {
  39. OError.tag(
  40. error,
  41. 'error finding doc contents for getDocument',
  42. {
  43. docId,
  44. projectId,
  45. }
  46. )
  47. return next(error)
  48. }
  49. if (plain) {
  50. plainTextResponse(res, lines.join('\n'))
  51. } else {
  52. const projectHistoryId = _.get(project, 'overleaf.history.id')
  53. const projectHistoryDisplay = _.get(
  54. project,
  55. 'overleaf.history.display'
  56. )
  57. const sendToBothHistorySystems = _.get(
  58. project,
  59. 'overleaf.history.allowDowngrade'
  60. )
  61. // if project has been switched but has 'allowDowngrade' set
  62. // then leave projectHistoryType undefined to (temporarily)
  63. // continue sending updates to both SL and full project history
  64. const projectHistoryType =
  65. projectHistoryDisplay && !sendToBothHistorySystems
  66. ? 'project-history'
  67. : undefined // for backwards compatibility, don't send anything if the project is still on track-changes
  68. res.json({
  69. lines,
  70. version,
  71. ranges,
  72. pathname: path.fileSystem,
  73. projectHistoryId,
  74. projectHistoryType,
  75. })
  76. }
  77. }
  78. )
  79. }
  80. )
  81. }
  82. )
  83. }
  84. function setDocument(req, res, next) {
  85. const { Project_id: projectId, doc_id: docId } = req.params
  86. const { lines, version, ranges, lastUpdatedAt, lastUpdatedBy } = req.body
  87. ProjectEntityUpdateHandler.updateDocLines(
  88. projectId,
  89. docId,
  90. lines,
  91. version,
  92. ranges,
  93. lastUpdatedAt,
  94. lastUpdatedBy,
  95. error => {
  96. if (error) {
  97. OError.tag(error, 'error finding element for getDocument', {
  98. docId,
  99. projectId,
  100. })
  101. return next(error)
  102. }
  103. logger.debug(
  104. { docId, projectId },
  105. 'finished receiving set document request from api (docupdater)'
  106. )
  107. res.sendStatus(200)
  108. }
  109. )
  110. }
  111. module.exports = { getDocument, setDocument }