UpdateMerger.coffee 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. _ = require('underscore')
  2. fs = require('fs')
  3. logger = require('logger-sharelatex')
  4. EditorController = require('../Editor/EditorController')
  5. FileTypeManager = require('../Uploads/FileTypeManager')
  6. FileWriter = require('../../infrastructure/FileWriter')
  7. ProjectEntityHandler = require('../Project/ProjectEntityHandler')
  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. FileWriter.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. _determineFileType: (project_id, path, fsPath, callback = (err, fileType) ->) ->
  19. ProjectEntityHandler.getAllEntities project_id, (err, docs, files) ->
  20. return callback(err) if err?
  21. if _.some(files, (f) -> f.path is path)
  22. return callback(null, "existing-file")
  23. if _.some(docs, (d) -> d.path is path)
  24. return callback(null, "existing-doc")
  25. # existing file not found in project, fall back to extension check
  26. FileTypeManager.isBinary path, fsPath, (err, isFile)->
  27. return callback(err) if err?
  28. if isFile
  29. callback(null, "new-file") # extension was not text
  30. else
  31. callback(null, "new-doc")
  32. _mergeUpdate: (user_id, project_id, path, fsPath, source, callback = (error) ->)->
  33. UpdateMerger._determineFileType project_id, path, fsPath, (err, fileType)->
  34. return callback(err) if err?
  35. if fileType in ["existing-file", "new-file"]
  36. UpdateMerger.p.processFile project_id, fsPath, path, source, user_id, callback
  37. else if fileType in ["existing-doc", "new-doc"]
  38. UpdateMerger.p.processDoc project_id, user_id, fsPath, path, source, callback
  39. else
  40. callback new Error("unrecognized file")
  41. deleteUpdate: (user_id, project_id, path, source, callback = () ->)->
  42. EditorController.deleteEntityWithPath project_id, path, source, user_id, () ->
  43. logger.log project_id:project_id, path:path, "finished processing update to delete entity from tpds"
  44. callback()
  45. p:
  46. processDoc: (project_id, user_id, fsPath, path, source, callback)->
  47. UpdateMerger.p.readFileIntoTextArray fsPath, (err, docLines)->
  48. if err?
  49. logger.err project_id:project_id, "error reading file into text array for process doc update"
  50. return callback(err)
  51. logger.log docLines:docLines, "processing doc update from tpds"
  52. EditorController.upsertDocWithPath project_id, path, docLines, source, user_id, (err) ->
  53. logger.log project_id:project_id, "completed processing file update from tpds"
  54. callback(err)
  55. processFile: (project_id, fsPath, path, source, user_id, callback)->
  56. logger.log project_id:project_id, "processing file update from tpds"
  57. EditorController.upsertFileWithPath project_id, path, fsPath, null, source, user_id, (err) ->
  58. logger.log project_id:project_id, "completed processing file update from tpds"
  59. callback(err)
  60. readFileIntoTextArray: (path, callback)->
  61. fs.readFile path, "utf8", (error, content = "") ->
  62. if error?
  63. logger.err path:path, "error reading file into text array"
  64. return callback(error)
  65. lines = content.split(/\r\n|\n|\r/)
  66. callback error, lines