ProjectGetter.coffee 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. mongojs = require("../../infrastructure/mongojs")
  2. metrics = require("metrics-sharelatex")
  3. db = mongojs.db
  4. ObjectId = mongojs.ObjectId
  5. async = require "async"
  6. Project = require("../../models/Project").Project
  7. logger = require("logger-sharelatex")
  8. LockManager = require("../../infrastructure/LockManager")
  9. module.exports = ProjectGetter =
  10. EXCLUDE_DEPTH: 8
  11. getProjectWithoutDocLines: (project_id, callback=(error, project) ->) ->
  12. excludes = {}
  13. for i in [1..ProjectGetter.EXCLUDE_DEPTH]
  14. excludes["rootFolder#{Array(i).join(".folders")}.docs.lines"] = 0
  15. db.projects.find _id: ObjectId(project_id.toString()), excludes, (error, projects = []) ->
  16. callback error, projects[0]
  17. getProjectWithOnlyFolders: (project_id, callback=(error, project) ->) ->
  18. excludes = {}
  19. for i in [1..ProjectGetter.EXCLUDE_DEPTH]
  20. excludes["rootFolder#{Array(i).join(".folders")}.docs"] = 0
  21. excludes["rootFolder#{Array(i).join(".folders")}.fileRefs"] = 0
  22. db.projects.find _id: ObjectId(project_id.toString()), excludes, (error, projects = []) ->
  23. callback error, projects[0]
  24. getProject: (project_id, projection, callback = (error, project) ->) ->
  25. if projection?.rootFolder
  26. LockManager.mongoTransactionLock.runWithLock project_id,
  27. (cb) -> ProjectGetter.getProjectWithoutLock project_id, projection, cb
  28. callback
  29. else
  30. ProjectGetter.getProjectWithoutLock project_id, projection, callback
  31. getProjectWithoutLock: (query, projection, callback = (error, project) ->) ->
  32. if !query?
  33. return callback("no query provided")
  34. if typeof(projection) == "function"
  35. callback = projection
  36. if typeof query == "string"
  37. query = _id: ObjectId(query)
  38. else if query instanceof ObjectId
  39. query = _id: query
  40. else if query?.toString().length == 24 # sometimes mongoose ids are hard to identify, this will catch them
  41. query = _id: ObjectId(query.toString())
  42. else
  43. err = new Error("malformed get request")
  44. logger.log query:query, err:err, type:typeof(query), "malformed get request"
  45. return callback(err)
  46. db.projects.find query, projection, (err, project) ->
  47. if err?
  48. logger.err err:err, query:query, projection:projection, "error getting project"
  49. return callback(err)
  50. callback(null, project?[0])
  51. findAllUsersProjects: (
  52. user_id,
  53. fields,
  54. callback = (error, projects={owned: [], readAndWrite: [], readOnly: [], tokenReadAndWrite: [], tokenReadOnly: []}) ->
  55. ) ->
  56. CollaboratorsHandler = require "../Collaborators/CollaboratorsHandler"
  57. Project.find {owner_ref: user_id}, fields, (error, ownedProjects) ->
  58. return callback(error) if error?
  59. CollaboratorsHandler.getProjectsUserIsMemberOf user_id, fields, (error, projects) ->
  60. return callback(error) if error?
  61. result = {
  62. owned: ownedProjects || [],
  63. readAndWrite: projects.readAndWrite || [],
  64. readOnly: projects.readOnly || [],
  65. tokenReadAndWrite: projects.tokenReadAndWrite || [],
  66. tokenReadOnly: projects.tokenReadOnly || []
  67. }
  68. callback null, result
  69. [
  70. 'getProject',
  71. 'getProjectWithoutDocLines'
  72. ].map (method) ->
  73. metrics.timeAsyncMethod(ProjectGetter, method, 'mongo.ProjectGetter', logger)