DocManager.coffee 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. MongoManager = require "./MongoManager"
  2. Errors = require "./Errors"
  3. logger = require "logger-sharelatex"
  4. _ = require "underscore"
  5. DocArchive = require "./DocArchiveManager"
  6. RangeManager = require "./RangeManager"
  7. module.exports = DocManager =
  8. # TODO: For historical reasons, the doc version is currently stored in the docOps
  9. # collection (which is all that this collection contains). In future, we should
  10. # migrate this version property to be part of the docs collection, to guarantee
  11. # consitency between lines and version when writing/reading, and for a simpler schema.
  12. getDoc: (project_id, doc_id, filter = { version: false }, callback = (error, doc) ->) ->
  13. MongoManager.findDoc project_id, doc_id, filter, (err, doc)->
  14. if err?
  15. return callback(err)
  16. else if !doc?
  17. return callback new Errors.NotFoundError("No such doc: #{doc_id} in project #{project_id}")
  18. else if doc?.inS3
  19. DocArchive.unarchiveDoc project_id, doc_id, (err)->
  20. if err?
  21. logger.err err:err, project_id:project_id, doc_id:doc_id, "error unarchiving doc"
  22. return callback(err)
  23. DocManager.getDoc project_id, doc_id, filter, callback
  24. else
  25. if filter.version
  26. MongoManager.getDocVersion doc_id, (error, version) ->
  27. return callback(error) if error?
  28. doc.version = version
  29. callback err, doc
  30. else
  31. callback err, doc
  32. getAllNonDeletedDocs: (project_id, filter, callback = (error, docs) ->) ->
  33. DocArchive.unArchiveAllDocs project_id, (error) ->
  34. MongoManager.getProjectsDocs project_id, {include_deleted: false}, filter, (error, docs) ->
  35. if err?
  36. return callback(error)
  37. else if !docs?
  38. return callback new Errors.NotFoundError("No docs for project #{project_id}")
  39. else
  40. return callback(null, docs)
  41. updateDoc: (project_id, doc_id, lines, version, ranges, callback = (error, modified, rev) ->) ->
  42. if !lines? or !version? or !ranges?
  43. return callback(new Error("no lines, version or ranges provided"))
  44. DocManager.getDoc project_id, doc_id, {version: true, rev: true, lines: true, version: true, ranges: true}, (err, doc)->
  45. if err? and !(err instanceof Errors.NotFoundError)
  46. logger.err project_id: project_id, doc_id: doc_id, err:err, "error getting document for update"
  47. return callback(err)
  48. ranges = RangeManager.jsonRangesToMongo(ranges)
  49. if !doc?
  50. # If the document doesn't exist, we'll make sure to create/update all parts of it.
  51. updateLines = true
  52. updateVersion = true
  53. updateRanges = true
  54. else
  55. updateLines = not _.isEqual(doc.lines, lines)
  56. updateVersion = (doc.version != version)
  57. updateRanges = RangeManager.shouldUpdateRanges(doc.ranges, ranges)
  58. modified = false
  59. rev = doc?.rev || 0
  60. updateLinesAndRangesIfNeeded = (cb) ->
  61. if updateLines or updateRanges
  62. update = {}
  63. if updateLines
  64. update.lines = lines
  65. if updateRanges
  66. update.ranges = ranges
  67. logger.log { project_id, doc_id, oldDoc: doc, update: update }, "updating doc lines and ranges"
  68. modified = true
  69. rev += 1 # rev will be incremented in mongo by MongoManager.upsertIntoDocCollection
  70. MongoManager.upsertIntoDocCollection project_id, doc_id, update, cb
  71. else
  72. logger.log { project_id, doc_id, }, "doc lines have not changed - not updating"
  73. cb()
  74. updateVersionIfNeeded = (cb) ->
  75. if updateVersion
  76. logger.log { project_id, doc_id, oldVersion: doc?.version, newVersion: version }, "updating doc version"
  77. modified = true
  78. MongoManager.setDocVersion doc_id, version, cb
  79. else
  80. logger.log { project_id, doc_id, version }, "doc version has not changed - not updating"
  81. cb()
  82. updateLinesAndRangesIfNeeded (error) ->
  83. return callback(error) if error?
  84. updateVersionIfNeeded (error) ->
  85. return callback(error) if error?
  86. callback null, modified, rev
  87. deleteDoc: (project_id, doc_id, callback = (error) ->) ->
  88. DocManager.getDoc project_id, doc_id, { version: false }, (error, doc) ->
  89. return callback(error) if error?
  90. return callback new Errors.NotFoundError("No such project/doc to delete: #{project_id}/#{doc_id}") if !doc?
  91. MongoManager.markDocAsDeleted project_id, doc_id, callback