DocumentController.mjs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import ChatApiHandler from '../Chat/ChatApiHandler.js'
  2. import ProjectGetter from '../Project/ProjectGetter.js'
  3. import ProjectLocator from '../Project/ProjectLocator.js'
  4. import ProjectEntityHandler from '../Project/ProjectEntityHandler.js'
  5. import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.js'
  6. import logger from '@overleaf/logger'
  7. import _ from 'lodash'
  8. import { plainTextResponse } from '../../infrastructure/Response.js'
  9. import { expressify } from '@overleaf/promise-utils'
  10. async function getDocument(req, res) {
  11. const { Project_id: projectId, doc_id: docId } = req.params
  12. const plain = req.query.plain === 'true'
  13. const peek = req.query.peek === 'true'
  14. const project = await ProjectGetter.promises.getProject(projectId, {
  15. rootFolder: true,
  16. overleaf: true,
  17. })
  18. if (!project) {
  19. return res.sendStatus(404)
  20. }
  21. const { path } = await ProjectLocator.promises.findElement({
  22. project,
  23. element_id: docId,
  24. type: 'doc',
  25. })
  26. const { lines, version, ranges } = await ProjectEntityHandler.promises.getDoc(
  27. projectId,
  28. docId,
  29. { peek }
  30. )
  31. const resolvedCommentIdsInProject =
  32. await ChatApiHandler.promises.getResolvedThreadIds(projectId)
  33. const commentIdsInDoc = new Set(
  34. ranges?.comments?.map(comment => comment.id) ?? []
  35. )
  36. const resolvedCommentIds = resolvedCommentIdsInProject.filter(commentId =>
  37. commentIdsInDoc.has(commentId)
  38. )
  39. if (plain) {
  40. plainTextResponse(res, lines.join('\n'))
  41. } else {
  42. const projectHistoryId = _.get(project, 'overleaf.history.id')
  43. const historyRangesSupport = _.get(
  44. project,
  45. 'overleaf.history.rangesSupportEnabled',
  46. false
  47. )
  48. // all projects are now migrated to Full Project History, keeping the field
  49. // for API compatibility
  50. const projectHistoryType = 'project-history'
  51. res.json({
  52. lines,
  53. version,
  54. ranges,
  55. pathname: path.fileSystem,
  56. projectHistoryId,
  57. projectHistoryType,
  58. historyRangesSupport,
  59. resolvedCommentIds,
  60. })
  61. }
  62. }
  63. async function setDocument(req, res) {
  64. const { Project_id: projectId, doc_id: docId } = req.params
  65. const { lines, version, ranges, lastUpdatedAt, lastUpdatedBy } = req.body
  66. const result = await ProjectEntityUpdateHandler.promises.updateDocLines(
  67. projectId,
  68. docId,
  69. lines,
  70. version,
  71. ranges,
  72. lastUpdatedAt,
  73. lastUpdatedBy
  74. )
  75. logger.debug(
  76. { docId, projectId },
  77. 'finished receiving set document request from api (docupdater)'
  78. )
  79. res.json(result)
  80. }
  81. export default {
  82. getDocument: expressify(getDocument),
  83. setDocument: expressify(setDocument),
  84. }