DocManager.coffee 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. MongoManager = require "./MongoManager"
  2. Errors = require "./Errors"
  3. logger = require "logger-sharelatex"
  4. _ = require "underscore"
  5. async = require "async"
  6. module.exports = DocManager =
  7. getDoc: (project_id, doc_id, callback = (error, doc, mongoPath) ->) ->
  8. MongoManager.findDoc doc_id, (err, docFromDocCollection)->
  9. return callback(err) if err?
  10. MongoManager.findProject project_id, (error, project) ->
  11. return callback(error) if error?
  12. return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
  13. DocManager.findDocInProject project, doc_id, (error, doc, mongoPath) ->
  14. return callback(error) if error?
  15. if docFromDocCollection?
  16. return callback null, docFromDocCollection, mongoPath
  17. else if doc?
  18. if doc?.lines?.length > 0
  19. logger.warn project_id:project_id, doc_id:doc_id, "doc just used from project collection, why?"
  20. return callback null, doc, mongoPath
  21. else
  22. return callback new Errors.NotFoundError("No such doc: #{project_id}")
  23. getAllDocs: (project_id, callback = (error, docs) ->) ->
  24. MongoManager.findProject project_id, (error, project) ->
  25. return callback(error) if error?
  26. return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
  27. DocManager.findAllDocsInProject project, (error, docs) ->
  28. return callback(error) if error?
  29. return callback null, docs
  30. updateDoc: (project_id, doc_id, lines, callback = (error, modified, rev) ->) ->
  31. DocManager.getDoc project_id, doc_id, (error, doc, mongoPath) ->
  32. return callback(error) if error?
  33. return callback new Errors.NotFoundError("No such project/doc to update: #{project_id}/#{doc_id}") if !doc? or !mongoPath?
  34. if _.isEqual(doc.lines, lines)
  35. logger.log {
  36. project_id: project_id, doc_id: doc_id, rev: doc.rev
  37. }, "doc lines have not changed"
  38. return callback null, false, doc.rev
  39. else
  40. logger.log {
  41. project_id: project_id
  42. doc_id: doc_id,
  43. oldDocLines: doc.lines
  44. newDocLines: lines
  45. rev: doc.rev
  46. }, "updating doc lines"
  47. async.series [
  48. (cb)->
  49. MongoManager.upsertIntoDocCollection project_id, doc_id, lines, doc.rev, cb
  50. (cb)->
  51. MongoManager.updateDoc project_id, mongoPath, lines, cb
  52. ], (error)->
  53. return callback(error) if error?
  54. callback null, true, doc.rev + 1 # rev will have been incremented in mongo by MongoManager.updateDoc
  55. deleteDoc: (project_id, doc_id, callback = (error) ->) ->
  56. DocManager.getDoc project_id, doc_id, (error, doc) ->
  57. return callback(error) if error?
  58. return callback new Errors.NotFoundError("No such project/doc to delete: #{project_id}/#{doc_id}") if !doc?
  59. MongoManager.upsertIntoDocCollection project_id, doc_id, doc.lines, doc.rev, (error) ->
  60. return callback(error) if error?
  61. MongoManager.markDocAsDeleted doc_id, (error) ->
  62. return callback(error) if error?
  63. callback()
  64. findAllDocsInProject: (project, callback = (error, docs) ->) ->
  65. callback null, @_findAllDocsInFolder project.rootFolder[0]
  66. findDocInProject: (project, doc_id, callback = (error, doc, mongoPath) ->) ->
  67. result = @_findDocInFolder project.rootFolder[0], doc_id, "rootFolder.0"
  68. if result?
  69. callback null, result.doc, result.mongoPath
  70. else
  71. callback null, null, null
  72. _findDocInFolder: (folder = {}, doc_id, currentPath) ->
  73. for doc, i in folder.docs or []
  74. if doc?._id? and doc._id.toString() == doc_id.toString()
  75. return {
  76. doc: doc
  77. mongoPath: "#{currentPath}.docs.#{i}"
  78. }
  79. for childFolder, i in folder.folders or []
  80. result = @_findDocInFolder childFolder, doc_id, "#{currentPath}.folders.#{i}"
  81. return result if result?
  82. return null
  83. _findAllDocsInFolder: (folder = {}) ->
  84. docs = folder.docs or []
  85. for childFolder in folder.folders or []
  86. docs = docs.concat @_findAllDocsInFolder childFolder
  87. return docs