DocManager.coffee 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. MongoManager = require "./MongoManager"
  2. Errors = require "./Errors"
  3. logger = require "logger-sharelatex"
  4. _ = require "underscore"
  5. async = require "async"
  6. settings = require("settings-sharelatex")
  7. request = require("request")
  8. crypto = require("crypto")
  9. thirtySeconds = 30 * 1000
  10. DocArchive = require "./DocArchiveManager"
  11. module.exports = DocManager =
  12. getDoc: (project_id, doc_id, callback = (error, doc) ->) ->
  13. MongoManager.findDoc doc_id, (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. return callback(err)
  22. MongoManager.findDoc doc_id, callback
  23. else
  24. callback err, doc
  25. getAllDocs: (project_id, callback = (error, docs) ->) ->
  26. DocArchive.unArchiveAllDocs project_id, (error) ->
  27. MongoManager.getProjectsDocs project_id, (error, docs) ->
  28. if err?
  29. return callback(error)
  30. else if !docs?
  31. return callback new Errors.NotFoundError("No docs for project #{project_id}")
  32. else
  33. return callback(null, docs)
  34. updateDoc: (project_id, doc_id, lines, callback = (error, modified, rev) ->) ->
  35. DocManager.getDoc project_id, doc_id, (err, doc)->
  36. if err? and !(err instanceof Errors.NotFoundError)
  37. logger.err project_id: project_id, doc_id: doc_id, err:err, "error getting document for update"
  38. return callback(err)
  39. isNewDoc = lines.length == 0
  40. linesAreSame = _.isEqual(doc?.lines, lines)
  41. if linesAreSame and !isNewDoc
  42. logger.log project_id: project_id, doc_id: doc_id, rev: doc?.rev, "doc lines have not changed - not updating"
  43. return callback null, false, doc?.rev
  44. else
  45. oldRev = doc?.rev || 0
  46. logger.log {
  47. project_id: project_id
  48. doc_id: doc_id,
  49. oldDocLines: doc?.lines
  50. newDocLines: lines
  51. rev: oldRev
  52. }, "updating doc lines"
  53. MongoManager.upsertIntoDocCollection project_id, doc_id, lines, (error)->
  54. return callback(callback) if error?
  55. callback null, true, oldRev + 1 # rev will have been incremented in mongo by MongoManager.updateDoc
  56. deleteDoc: (project_id, doc_id, callback = (error) ->) ->
  57. DocManager.getDoc project_id, doc_id, (error, doc) ->
  58. return callback(error) if error?
  59. return callback new Errors.NotFoundError("No such project/doc to delete: #{project_id}/#{doc_id}") if !doc?
  60. MongoManager.upsertIntoDocCollection project_id, doc_id, doc.lines, (error) ->
  61. return callback(error) if error?
  62. MongoManager.markDocAsDeleted doc_id, (error) ->
  63. return callback(error) if error?
  64. callback()