DocumentController.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. // all projects are now migrated to Full Project History, keeping the field
  54. // for API compatibility
  55. const projectHistoryType = 'project-history'
  56. res.json({
  57. lines,
  58. version,
  59. ranges,
  60. pathname: path.fileSystem,
  61. projectHistoryId,
  62. projectHistoryType,
  63. })
  64. }
  65. }
  66. )
  67. }
  68. )
  69. }
  70. )
  71. }
  72. function setDocument(req, res, next) {
  73. const { Project_id: projectId, doc_id: docId } = req.params
  74. const { lines, version, ranges, lastUpdatedAt, lastUpdatedBy } = req.body
  75. ProjectEntityUpdateHandler.updateDocLines(
  76. projectId,
  77. docId,
  78. lines,
  79. version,
  80. ranges,
  81. lastUpdatedAt,
  82. lastUpdatedBy,
  83. (error, result) => {
  84. if (error) {
  85. OError.tag(error, 'error finding element for getDocument', {
  86. docId,
  87. projectId,
  88. })
  89. return next(error)
  90. }
  91. logger.debug(
  92. { docId, projectId },
  93. 'finished receiving set document request from api (docupdater)'
  94. )
  95. res.json(result)
  96. }
  97. )
  98. }
  99. module.exports = { getDocument, setDocument }