ProjectEntityRestoreHandler.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const { callbackify } = require('util')
  2. const Path = require('path')
  3. const ProjectEntityHandler = require('./ProjectEntityHandler')
  4. const EditorController = require('../Editor/EditorController')
  5. // generate a new name based on the original, with an optional label.
  6. // e.g. origname-20210101-122345.tex (default)
  7. // origname-restored-20210101-122345.tex (label="restored")
  8. function generateRestoredName(docName, label) {
  9. const formattedTimestamp = new Date()
  10. .toISOString()
  11. .replace('T', '-')
  12. .replace(/[^0-9-]/g, '')
  13. const extension = Path.extname(docName)
  14. const basename =
  15. Path.basename(docName, extension) + (label ? `-${label}` : '')
  16. return `${basename}-${formattedTimestamp}${extension}`
  17. }
  18. async function restoreDeletedDoc(projectId, docId, docName, userId) {
  19. const deletedDoc = await ProjectEntityHandler.promises.getDoc(
  20. projectId,
  21. docId,
  22. { include_deleted: true }
  23. )
  24. const deletedDocName = generateRestoredName(docName)
  25. // Create the doc and emit a websocket message.
  26. return await EditorController.promises.addDocWithRanges(
  27. projectId,
  28. null,
  29. `${deletedDocName}`,
  30. deletedDoc.lines,
  31. deletedDoc.ranges,
  32. null,
  33. userId
  34. )
  35. }
  36. module.exports = {
  37. restoreDeletedDoc: callbackify(restoreDeletedDoc),
  38. generateRestoredName,
  39. promises: {
  40. restoreDeletedDoc,
  41. },
  42. }