UpdateMerger.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. _ = require('underscore')
  2. projectLocator = require('../Project/ProjectLocator')
  3. editorController = require('../Editor/EditorController')
  4. logger = require('logger-sharelatex')
  5. Settings = require('settings-sharelatex')
  6. FileTypeManager = require('../Uploads/FileTypeManager')
  7. uuid = require('node-uuid')
  8. fs = require('fs')
  9. module.exports =
  10. mergeUpdate: (project_id, path, updateRequest, source, callback = (error) ->)->
  11. self = @
  12. logger.log project_id:project_id, path:path, "merging update from tpds"
  13. projectLocator.findElementByPath project_id, path, (err, element)=>
  14. # Returns an error if the element is not found
  15. #return callback(err) if err?
  16. logger.log project_id:project_id, path:path, "found element by path for merging update from tpds"
  17. elementId = undefined
  18. if element?
  19. elementId = element._id
  20. self.p.writeStreamToDisk project_id, elementId, updateRequest, (err, fsPath)->
  21. return callback(err) if err?
  22. FileTypeManager.isBinary path, fsPath, (err, isFile)->
  23. return callback(err) if err?
  24. if isFile
  25. self.p.processFile project_id, elementId, fsPath, path, source, callback #TODO clean up the stream written to disk here
  26. else
  27. self.p.processDoc project_id, elementId, fsPath, path, source, callback
  28. deleteUpdate: (project_id, path, source, callback)->
  29. projectLocator.findElementByPath project_id, path, (err, element)->
  30. type = 'file'
  31. if err? || !element?
  32. logger.log element:element, project_id:project_id, path:path, "could not find entity for deleting, assuming it was already deleted"
  33. return callback()
  34. if element.lines?
  35. type = 'doc'
  36. else if element.folders?
  37. type = 'folder'
  38. logger.log project_id:project_id, updateType:path, updateType:type, element:element, "processing update to delete entity from tpds"
  39. editorController.deleteEntity project_id, element._id, type, source, (err)->
  40. logger.log project_id:project_id, path:path, "finished processing update to delete entity from tpds"
  41. callback()
  42. p:
  43. processDoc: (project_id, doc_id, fsPath, path, source, callback)->
  44. readFileIntoTextArray fsPath, (err, docLines)->
  45. if err?
  46. logger.err project_id:project_id, doc_id:doc_id, fsPath:fsPath, "error reading file into text array for process doc update"
  47. return callback(err)
  48. logger.log docLines:docLines, doc_id:doc_id, project_id:project_id, "processing doc update from tpds"
  49. if doc_id?
  50. editorController.setDoc project_id, doc_id, docLines, source, (err)->
  51. callback()
  52. else
  53. setupNewEntity project_id, path, (err, folder, fileName)->
  54. editorController.addDoc project_id, folder._id, fileName, docLines, source, (err)->
  55. callback()
  56. processFile: (project_id, file_id, fsPath, path, source, callback)->
  57. finish = (err)->
  58. logger.log project_id:project_id, file_id:file_id, path:path, "completed processing file update from tpds"
  59. callback(err)
  60. logger.log project_id:project_id, file_id:file_id, path:path, "processing file update from tpds"
  61. setupNewEntity project_id, path, (err, folder, fileName) =>
  62. if file_id?
  63. editorController.replaceFile project_id, file_id, fsPath, source, finish
  64. else
  65. editorController.addFile project_id, folder._id, fileName, fsPath, source, finish
  66. writeStreamToDisk: (project_id, file_id, stream, callback = (err, fsPath)->)->
  67. if !file_id?
  68. file_id = uuid.v4()
  69. dumpPath = "#{Settings.path.dumpFolder}/#{project_id}_#{file_id}"
  70. writeStream = fs.createWriteStream(dumpPath)
  71. stream.pipe(writeStream)
  72. stream.on 'error', (err)->
  73. logger.err err:err, project_id:project_id, file_id:file_id, dumpPath:dumpPath,
  74. "something went wrong with incoming tpds update stream"
  75. writeStream.on 'error', (err)->
  76. logger.err err:err, project_id:project_id, file_id:file_id, dumpPath:dumpPath,
  77. "something went wrong with writing tpds update to disk"
  78. stream.on 'end', ->
  79. logger.log project_id:project_id, file_id:file_id, dumpPath:dumpPath, "incoming tpds update stream ended"
  80. writeStream.on "finish", ->
  81. logger.log project_id:project_id, file_id:file_id, dumpPath:dumpPath, "tpds update write stream finished"
  82. callback null, dumpPath
  83. readFileIntoTextArray = (path, callback)->
  84. fs.readFile path, "utf8", (error, content = "") ->
  85. if error?
  86. logger.err path:path, "error reading file into text array"
  87. return callback(err)
  88. lines = content.split(/\r\n|\n|\r/)
  89. callback error, lines
  90. setupNewEntity = (project_id, path, callback)->
  91. lastIndexOfSlash = path.lastIndexOf("/")
  92. fileName = path[lastIndexOfSlash+1 .. -1]
  93. folderPath = path[0 .. lastIndexOfSlash]
  94. editorController.mkdirp project_id, folderPath, (err, newFolders, lastFolder)->
  95. callback err, lastFolder, fileName