ProjectGetter.coffee 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. mongojs = require("../../infrastructure/mongojs")
  2. db = mongojs.db
  3. ObjectId = mongojs.ObjectId
  4. async = require "async"
  5. Errors = require("../../errors")
  6. logger = require("logger-sharelatex")
  7. module.exports = ProjectGetter =
  8. EXCLUDE_DEPTH: 8
  9. _returnProjectIfPassed: (project_or_id, callback, continueCallback)->
  10. if project_or_id._id?
  11. callback null, project_or_id
  12. else
  13. try
  14. ObjectId(project_or_id.toString())
  15. catch e
  16. return continueCallback(new Errors.NotFoundError(e.message))
  17. continueCallback()
  18. getProjectWithoutDocLines: (project_or_id, callback=(error, project) ->) ->
  19. ProjectGetter._returnProjectIfPassed project_or_id, callback, (err)->
  20. return callback(err) if err?
  21. project_id = project_or_id
  22. excludes = {}
  23. for i in [1..ProjectGetter.EXCLUDE_DEPTH]
  24. excludes["rootFolder#{Array(i).join(".folder")}.docs.lines"] = 0
  25. db.projects.find _id: ObjectId(project_id.toString()), excludes, (error, projects = []) ->
  26. callback error, projects[0]
  27. getProjectWithOnlyFolders: (project_or_id, callback=(error, project) ->) ->
  28. ProjectGetter._returnProjectIfPassed project_or_id, callback, (err)->
  29. return callback(err) if err?
  30. project_id = project_or_id
  31. excludes = {}
  32. for i in [1..ProjectGetter.EXCLUDE_DEPTH]
  33. excludes["rootFolder#{Array(i).join(".folder")}.docs"] = 0
  34. excludes["rootFolder#{Array(i).join(".folder")}.fileRefs"] = 0
  35. db.projects.find _id: ObjectId(project_id.toString()), excludes, (error, projects = []) ->
  36. callback error, projects[0]
  37. getProject: (project_or_id, projection, callback = (error, project) ->) ->
  38. if !project_or_id?
  39. return callback("no id or project provided")
  40. if typeof(projection) == "function"
  41. callback = projection
  42. ProjectGetter._returnProjectIfPassed project_or_id, callback, (err)->
  43. if typeof project_or_id == "string"
  44. query = _id: ObjectId(project_or_id)
  45. else if project_or_id instanceof ObjectId
  46. query = _id: project_or_id
  47. else if project_or_id?.toString().length == 24 # sometimes mongoose ids are hard to identify, this will catch them
  48. query = _id: ObjectId(project_or_id.toString())
  49. else
  50. err = new Error("malformed get request")
  51. logger.log project_or_id:project_or_id, err:err, type:typeof(project_or_id), "malformed get request"
  52. return callback(err)
  53. db.projects.find query, projection, (err, project)->
  54. if err?
  55. logger.err err:err, query:query, projection:projection, "error getting project"
  56. return callback(err)
  57. callback(null, project?[0])
  58. populateProjectWithUsers: (project, callback=(error, project) ->) ->
  59. # eventually this should be in a UserGetter.getUser module
  60. getUser = (user_id, callback=(error, user) ->) ->
  61. unless user_id instanceof ObjectId
  62. user_id = ObjectId(user_id)
  63. db.users.find _id: user_id, (error, users = []) ->
  64. callback error, users[0]
  65. jobs = []
  66. jobs.push (callback) ->
  67. getUser project.owner_ref, (error, user) ->
  68. return callback(error) if error?
  69. if user?
  70. project.owner_ref = user
  71. callback null, project
  72. readOnly_refs = project.readOnly_refs
  73. project.readOnly_refs = []
  74. for readOnly_ref in readOnly_refs
  75. do (readOnly_ref) ->
  76. jobs.push (callback) ->
  77. getUser readOnly_ref, (error, user) ->
  78. return callback(error) if error?
  79. if user?
  80. project.readOnly_refs.push user
  81. callback null, project
  82. collaberator_refs = project.collaberator_refs
  83. project.collaberator_refs = []
  84. for collaberator_ref in collaberator_refs
  85. do (collaberator_ref) ->
  86. jobs.push (callback) ->
  87. getUser collaberator_ref, (error, user) ->
  88. return callback(error) if error?
  89. if user?
  90. project.collaberator_refs.push user
  91. callback null, project
  92. async.parallelLimit jobs, 3, (error) -> callback error, project