DocManager.coffee 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. MongoManager = require "./MongoManager"
  2. Errors = require "./Errors"
  3. logger = require "logger-sharelatex"
  4. _ = require "underscore"
  5. module.exports = DocManager =
  6. getDoc: (project_id, doc_id, callback = (error, doc, mongoPath) ->) ->
  7. MongoManager.findProject project_id, (error, project) ->
  8. return callback(error) if error?
  9. return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
  10. DocManager.findDocInProject project, doc_id, (error, doc, mongoPath) ->
  11. return callback(error) if error?
  12. return callback new Errors.NotFoundError("No such doc: #{project_id}") if !doc?
  13. return callback null, doc, mongoPath
  14. getAllDocs: (project_id, callback = (error, docs) ->) ->
  15. MongoManager.findProject project_id, (error, project) ->
  16. return callback(error) if error?
  17. return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
  18. DocManager.findAllDocsInProject project, (error, docs) ->
  19. return callback(error) if error?
  20. return callback null, docs
  21. updateDoc: (project_id, doc_id, lines, callback = (error, modified) ->) ->
  22. DocManager.getDoc project_id, doc_id, (error, doc, mongoPath) ->
  23. return callback(error) if error?
  24. return callback new Errors.NotFoundError("No such project/doc: #{project_id}/#{doc_id}") if !doc?
  25. if _.isEqual(doc.lines, lines)
  26. logger.log {
  27. project_id: project_id, doc_id: doc_id, rev: doc.rev
  28. }, "doc lines have not changed"
  29. return callback null, false
  30. else
  31. logger.log {
  32. project_id: project_id, doc_id: doc_id, oldDocLines: doc.lines, newDocLines: lines, rev: doc.rev
  33. }, "updating doc lines"
  34. MongoManager.updateDoc project_id, mongoPath, lines, (error) ->
  35. return callback(error) if error?
  36. callback null, true
  37. deleteDoc: (project_id, doc_id, callback = (error) ->) ->
  38. DocManager.getDoc project_id, doc_id, (error, doc) ->
  39. return callback(error) if error?
  40. return callback new Errors.NotFoundError("No such project/doc: #{project_id}/#{doc_id}") if !doc?
  41. MongoManager.insertDoc project_id, doc_id, { lines: doc.lines, deleted: true }, (error) ->
  42. return callback(error) if error?
  43. callback()
  44. findAllDocsInProject: (project, callback = (error, docs) ->) ->
  45. callback null, @_findAllDocsInFolder project.rootFolder[0]
  46. findDocInProject: (project, doc_id, callback = (error, doc, mongoPath) ->) ->
  47. result = @_findDocInFolder project.rootFolder[0], doc_id, "rootFolder.0"
  48. if result?
  49. callback null, result.doc, result.mongoPath
  50. else
  51. callback null, null, null
  52. _findDocInFolder: (folder, doc_id, currentPath) ->
  53. for doc, i in folder.docs or []
  54. if doc._id.toString() == doc_id.toString()
  55. return {
  56. doc: doc
  57. mongoPath: "#{currentPath}.docs.#{i}"
  58. }
  59. for childFolder, i in folder.folders or []
  60. result = @_findDocInFolder childFolder, doc_id, "#{currentPath}.folders.#{i}"
  61. return result if result?
  62. return null
  63. _findAllDocsInFolder: (folder) ->
  64. docs = folder.docs or []
  65. for childFolder in folder.folders or []
  66. docs = docs.concat @_findAllDocsInFolder childFolder
  67. return docs