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. function getDocument(req, res, next) {
  9. const { Project_id: projectId, doc_id: docId } = req.params
  10. const plain = req.query.plain === 'true'
  11. const peek = req.query.peek === 'true'
  12. ProjectGetter.getProject(
  13. projectId,
  14. { rootFolder: true, overleaf: true },
  15. (error, project) => {
  16. if (error) {
  17. return next(error)
  18. }
  19. if (!project) {
  20. return res.sendStatus(404)
  21. }
  22. ProjectLocator.findElement(
  23. { project, element_id: docId, type: 'doc' },
  24. (error, doc, path) => {
  25. if (error) {
  26. OError.tag(error, 'error finding element for getDocument', {
  27. docId,
  28. projectId,
  29. })
  30. return next(error)
  31. }
  32. ProjectEntityHandler.getDoc(
  33. projectId,
  34. docId,
  35. { peek },
  36. (error, lines, rev, version, ranges) => {
  37. if (error) {
  38. OError.tag(
  39. error,
  40. 'error finding doc contents for getDocument',
  41. {
  42. docId,
  43. projectId,
  44. }
  45. )
  46. return next(error)
  47. }
  48. if (plain) {
  49. res.type('text/plain')
  50. res.send(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.log(
  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 }