DiffManager.coffee 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. UpdatesManager = require "./UpdatesManager"
  2. DocumentUpdaterManager = require "./DocumentUpdaterManager"
  3. DiffGenerator = require "./DiffGenerator"
  4. logger = require "logger-sharelatex"
  5. module.exports = DiffManager =
  6. getLatestDocAndUpdates: (project_id, doc_id, fromVersion, toVersion, callback = (error, content, version, updates) ->) ->
  7. UpdatesManager.getDocUpdatesWithUserInfo project_id, doc_id, from: fromVersion, to: toVersion, (error, updates) ->
  8. return callback(error) if error?
  9. DocumentUpdaterManager.getDocument project_id, doc_id, (error, content, version) ->
  10. return callback(error) if error?
  11. callback(null, content, version, updates)
  12. getDiff: (project_id, doc_id, fromVersion, toVersion, callback = (error, diff) ->) ->
  13. logger.log project_id: project_id, doc_id: doc_id, from: fromVersion, to: toVersion, "getting diff"
  14. DiffManager.getDocumentBeforeVersion project_id, doc_id, fromVersion, (error, startingContent, updates) ->
  15. return callback(error) if error?
  16. updatesToApply = []
  17. for update in updates.slice().reverse()
  18. if update.v <= toVersion
  19. updatesToApply.push update
  20. try
  21. diff = DiffGenerator.buildDiff startingContent, updatesToApply
  22. catch e
  23. return callback(e)
  24. callback(null, diff)
  25. getDocumentBeforeVersion: (project_id, doc_id, version, callback = (error, document, rewoundUpdates) ->) ->
  26. logger.log project_id: project_id, doc_id: doc_id, version: version, "getting document before version"
  27. DiffManager.getLatestDocAndUpdates project_id, doc_id, version, null, (error, content, version, updates) ->
  28. return callback(error) if error?
  29. lastUpdate = updates[0]
  30. if lastUpdate? and lastUpdate.v != version - 1
  31. return callback new Error("latest update version, #{lastUpdate.v}, does not match doc version, #{version}")
  32. try
  33. startingContent = DiffGenerator.rewindUpdates content, updates.slice().reverse()
  34. catch e
  35. return callback(e)
  36. callback(null, startingContent, updates)