RangesManager.coffee 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. RangesTracker = require "./RangesTracker"
  2. logger = require "logger-sharelatex"
  3. module.exports = RangesManager =
  4. MAX_COMMENTS: 500
  5. MAX_CHANGES: 2000
  6. applyUpdate: (project_id, doc_id, entries = {}, updates = [], newDocLines, callback = (error, new_entries) ->) ->
  7. {changes, comments} = entries
  8. rangesTracker = new RangesTracker(changes, comments)
  9. for update in updates
  10. rangesTracker.track_changes = !!update.meta.tc
  11. if !!update.meta.tc
  12. rangesTracker.setIdSeed(update.meta.tc)
  13. for op in update.op
  14. try
  15. rangesTracker.applyOp(op, { user_id: update.meta?.user_id })
  16. catch error
  17. return callback(error)
  18. if rangesTracker.changes?.length > RangesManager.MAX_CHANGES or rangesTracker.comments?.length > RangesManager.MAX_COMMENTS
  19. return callback new Error("too many comments or tracked changes")
  20. try
  21. # This is a consistency check that all of our ranges and
  22. # comments still match the corresponding text
  23. rangesTracker.validate(newDocLines.join("\n"))
  24. catch error
  25. logger.error {err: error, project_id, doc_id, newDocLines, updates}, "error validating ranges"
  26. return callback(error)
  27. response = RangesManager._getRanges rangesTracker
  28. logger.log {project_id, doc_id, changesCount: response.changes?.length, commentsCount: response.comments?.length}, "applied updates to ranges"
  29. callback null, response
  30. acceptChanges: (change_ids, ranges, callback = (error, ranges) ->) ->
  31. {changes, comments} = ranges
  32. logger.log "accepting #{ change_ids.length } changes in ranges"
  33. rangesTracker = new RangesTracker(changes, comments)
  34. rangesTracker.removeChangeIds(change_ids)
  35. response = RangesManager._getRanges(rangesTracker)
  36. callback null, response
  37. deleteComment: (comment_id, ranges, callback = (error, ranges) ->) ->
  38. {changes, comments} = ranges
  39. logger.log {comment_id}, "deleting comment in ranges"
  40. rangesTracker = new RangesTracker(changes, comments)
  41. rangesTracker.removeCommentId(comment_id)
  42. response = RangesManager._getRanges(rangesTracker)
  43. callback null, response
  44. _getRanges: (rangesTracker) ->
  45. # Return the minimal data structure needed, since most documents won't have any
  46. # changes or comments
  47. response = {}
  48. if rangesTracker.changes?.length > 0
  49. response ?= {}
  50. response.changes = rangesTracker.changes
  51. if rangesTracker.comments?.length > 0
  52. response ?= {}
  53. response.comments = rangesTracker.comments
  54. return response