ProjectGetter.coffee 2.9 KB

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