RestoreManager.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. Settings = require 'settings-sharelatex'
  2. Path = require 'path'
  3. FileWriter = require '../../infrastructure/FileWriter'
  4. FileSystemImportManager = require '../Uploads/FileSystemImportManager'
  5. ProjectEntityHandler = require '../Project/ProjectEntityHandler'
  6. ProjectLocator = require '../Project/ProjectLocator'
  7. EditorController = require '../Editor/EditorController'
  8. Errors = require '../Errors/Errors'
  9. moment = require 'moment'
  10. module.exports = RestoreManager =
  11. restoreDocFromDeletedDoc: (user_id, project_id, doc_id, name, callback = (error, doc, folder_id) ->) ->
  12. # This is the legacy method for restoring a doc from the SL track-changes/deletedDocs system.
  13. # It looks up the deleted doc's contents, and then creates a new doc with the same content.
  14. # We don't actually remove the deleted doc entry, just create a new one from its lines.
  15. ProjectEntityHandler.getDoc project_id, doc_id, include_deleted: true, (error, lines) ->
  16. return callback(error) if error?
  17. addDocWithName = (name, callback) ->
  18. EditorController.addDoc project_id, null, name, lines, 'restore', user_id, callback
  19. RestoreManager._addEntityWithUniqueName addDocWithName, name, callback
  20. restoreFileFromV2: (user_id, project_id, version, pathname, callback = (error, entity) ->) ->
  21. RestoreManager._writeFileVersionToDisk project_id, version, pathname, (error, fsPath) ->
  22. return callback(error) if error?
  23. basename = Path.basename(pathname)
  24. dirname = Path.dirname(pathname)
  25. if dirname == '.' # no directory
  26. dirname = ''
  27. RestoreManager._findOrCreateFolder project_id, dirname, (error, parent_folder_id) ->
  28. return callback(error) if error?
  29. addEntityWithName = (name, callback) ->
  30. FileSystemImportManager.addEntity user_id, project_id, parent_folder_id, name, fsPath, false, callback
  31. RestoreManager._addEntityWithUniqueName addEntityWithName, basename, callback
  32. _findOrCreateFolder: (project_id, dirname, callback = (error, folder_id) ->) ->
  33. EditorController.mkdirp project_id, dirname, (error, newFolders, lastFolder) ->
  34. return callback(error) if error?
  35. return callback(null, lastFolder?._id)
  36. _addEntityWithUniqueName: (addEntityWithName, basename, callback = (error) ->) ->
  37. addEntityWithName basename, (error, entity) ->
  38. if error?
  39. if error instanceof Errors.InvalidNameError
  40. # likely a duplicate name, so try with a prefix
  41. date = moment(new Date()).format('Do MMM YY H:mm:ss')
  42. # Move extension to the end so the file type is preserved
  43. extension = Path.extname(basename)
  44. basename = Path.basename(basename, extension)
  45. basename = "#{basename} (Restored on #{date})"
  46. if extension != ''
  47. basename = "#{basename}#{extension}"
  48. addEntityWithName basename, callback
  49. else
  50. callback(error)
  51. else
  52. callback(null, entity)
  53. _writeFileVersionToDisk: (project_id, version, pathname, callback = (error, fsPath) ->) ->
  54. url = "#{Settings.apis.project_history.url}/project/#{project_id}/version/#{version}/#{encodeURIComponent(pathname)}"
  55. FileWriter.writeUrlToDisk project_id, url, callback