| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- Settings = require 'settings-sharelatex'
- Path = require 'path'
- FileWriter = require '../../infrastructure/FileWriter'
- FileSystemImportManager = require '../Uploads/FileSystemImportManager'
- ProjectEntityHandler = require '../Project/ProjectEntityHandler'
- ProjectLocator = require '../Project/ProjectLocator'
- EditorController = require '../Editor/EditorController'
- Errors = require '../Errors/Errors'
- moment = require 'moment'
- module.exports = RestoreManager =
- restoreDocFromDeletedDoc: (user_id, project_id, doc_id, name, callback = (error, doc, folder_id) ->) ->
- # This is the legacy method for restoring a doc from the SL track-changes/deletedDocs system.
- # It looks up the deleted doc's contents, and then creates a new doc with the same content.
- # We don't actually remove the deleted doc entry, just create a new one from its lines.
- ProjectEntityHandler.getDoc project_id, doc_id, include_deleted: true, (error, lines) ->
- return callback(error) if error?
- addDocWithName = (name, callback) ->
- EditorController.addDoc project_id, null, name, lines, 'restore', user_id, callback
- RestoreManager._addEntityWithUniqueName addDocWithName, name, callback
- restoreFileFromV2: (user_id, project_id, version, pathname, callback = (error, entity) ->) ->
- RestoreManager._writeFileVersionToDisk project_id, version, pathname, (error, fsPath) ->
- return callback(error) if error?
- basename = Path.basename(pathname)
- dirname = Path.dirname(pathname)
- if dirname == '.' # no directory
- dirname = ''
- RestoreManager._findOrCreateFolder project_id, dirname, (error, parent_folder_id) ->
- return callback(error) if error?
- addEntityWithName = (name, callback) ->
- FileSystemImportManager.addEntity user_id, project_id, parent_folder_id, name, fsPath, false, callback
- RestoreManager._addEntityWithUniqueName addEntityWithName, basename, callback
- _findOrCreateFolder: (project_id, dirname, callback = (error, folder_id) ->) ->
- EditorController.mkdirp project_id, dirname, (error, newFolders, lastFolder) ->
- return callback(error) if error?
- return callback(null, lastFolder?._id)
- _addEntityWithUniqueName: (addEntityWithName, basename, callback = (error) ->) ->
- addEntityWithName basename, (error, entity) ->
- if error?
- if error instanceof Errors.InvalidNameError
- # likely a duplicate name, so try with a prefix
- date = moment(new Date()).format('Do MMM YY H:mm:ss')
- # Move extension to the end so the file type is preserved
- extension = Path.extname(basename)
- basename = Path.basename(basename, extension)
- basename = "#{basename} (Restored on #{date})"
- if extension != ''
- basename = "#{basename}#{extension}"
- addEntityWithName basename, callback
- else
- callback(error)
- else
- callback(null, entity)
- _writeFileVersionToDisk: (project_id, version, pathname, callback = (error, fsPath) ->) ->
- url = "#{Settings.apis.project_history.url}/project/#{project_id}/version/#{version}/#{encodeURIComponent(pathname)}"
- FileWriter.writeUrlToDisk project_id, url, callback
|