UpdateMerger.coffee 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. _ = require('underscore')
  2. fs = require('fs')
  3. logger = require('logger-sharelatex')
  4. uuid = require('uuid')
  5. EditorController = require('../Editor/EditorController')
  6. FileTypeManager = require('../Uploads/FileTypeManager')
  7. Settings = require('settings-sharelatex')
  8. module.exports = UpdateMerger =
  9. mergeUpdate: (user_id, project_id, path, updateRequest, source, callback = (error) ->)->
  10. logger.log project_id:project_id, path:path, "merging update from tpds"
  11. UpdateMerger.p.writeStreamToDisk project_id, updateRequest, (err, fsPath)->
  12. return callback(err) if err?
  13. UpdateMerger._mergeUpdate user_id, project_id, path, fsPath, source, (mergeErr) ->
  14. fs.unlink fsPath, (deleteErr) ->
  15. if deleteErr?
  16. logger.err project_id:project_id, fsPath:fsPath, "error deleting file"
  17. callback mergeErr
  18. _mergeUpdate: (user_id, project_id, path, fsPath, source, callback = (error) ->)->
  19. FileTypeManager.isBinary path, fsPath, (err, isFile)->
  20. return callback(err) if err?
  21. if isFile
  22. UpdateMerger.p.processFile project_id, fsPath, path, source, user_id, callback
  23. else
  24. UpdateMerger.p.processDoc project_id, user_id, fsPath, path, source, callback
  25. deleteUpdate: (user_id, project_id, path, source, callback = () ->)->
  26. EditorController.deleteEntityWithPath project_id, path, source, user_id, () ->
  27. logger.log project_id:project_id, path:path, "finished processing update to delete entity from tpds"
  28. callback()
  29. p:
  30. processDoc: (project_id, user_id, fsPath, path, source, callback)->
  31. UpdateMerger.p.readFileIntoTextArray fsPath, (err, docLines)->
  32. if err?
  33. logger.err project_id:project_id, "error reading file into text array for process doc update"
  34. return callback(err)
  35. logger.log docLines:docLines, "processing doc update from tpds"
  36. EditorController.upsertDocWithPath project_id, path, docLines, source, user_id, (err) ->
  37. logger.log project_id:project_id, "completed processing file update from tpds"
  38. callback(err)
  39. processFile: (project_id, fsPath, path, source, user_id, callback)->
  40. logger.log project_id:project_id, "processing file update from tpds"
  41. EditorController.upsertFileWithPath project_id, path, fsPath, source, user_id, (err) ->
  42. logger.log project_id:project_id, "completed processing file update from tpds"
  43. callback(err)
  44. writeStreamToDisk: (project_id, stream, callback = (err, fsPath)->)->
  45. dumpPath = "#{Settings.path.dumpFolder}/#{project_id}_#{uuid.v4()}"
  46. writeStream = fs.createWriteStream(dumpPath)
  47. stream.pipe(writeStream)
  48. stream.on 'error', (err)->
  49. logger.err {err, project_id, dumpPath},
  50. "something went wrong with incoming tpds update stream"
  51. writeStream.on 'error', (err)->
  52. logger.err {err, project_id, dumpPath},
  53. "something went wrong with writing tpds update to disk"
  54. stream.on 'end', ->
  55. logger.log {project_id, dumpPath}, "incoming tpds update stream ended"
  56. writeStream.on "finish", ->
  57. logger.log {project_id, dumpPath}, "tpds update write stream finished"
  58. callback null, dumpPath
  59. readFileIntoTextArray: (path, callback)->
  60. fs.readFile path, "utf8", (error, content = "") ->
  61. if error?
  62. logger.err path:path, "error reading file into text array"
  63. return callback(error)
  64. lines = content.split(/\r\n|\n|\r/)
  65. callback error, lines