DocManager.coffee 2.7 KB

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