ProjectGetter.coffee 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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) ->
  23. if typeof(projection) == "function" && !callback?
  24. callback = projection
  25. projection = {}
  26. if !project_id?
  27. return callback(new Error("no project_id provided"))
  28. if typeof(projection) != "object"
  29. return callback(new Error("projection is not an object"))
  30. if projection?.rootFolder || Object.keys(projection).length == 0
  31. ProjectEntityMongoUpdateHandler = require './ProjectEntityMongoUpdateHandler'
  32. LockManager.runWithLock ProjectEntityMongoUpdateHandler.LOCK_NAMESPACE, project_id,
  33. (cb) -> ProjectGetter.getProjectWithoutLock project_id, projection, cb
  34. callback
  35. else
  36. ProjectGetter.getProjectWithoutLock project_id, projection, callback
  37. getProjectWithoutLock: (project_id, projection, callback) ->
  38. if typeof(projection) == "function" && !callback?
  39. callback = projection
  40. projection = {}
  41. if !project_id?
  42. return callback(new Error("no project_id provided"))
  43. if typeof(projection) != "object"
  44. return callback(new Error("projection is not an object"))
  45. if typeof project_id == "string"
  46. query = _id: ObjectId(project_id)
  47. else if project_id instanceof ObjectId
  48. query = _id: project_id
  49. else if project_id?.toString().length == 24 # sometimes mongoose ids are hard to identify, this will catch them
  50. query = _id: ObjectId(project_id.toString())
  51. else
  52. err = new Error("malformed get request")
  53. logger.log project_id:project_id, err:err, type:typeof(project_id), "malformed get request"
  54. return callback(err)
  55. db.projects.find query, projection, (err, project) ->
  56. if err?
  57. logger.err err:err, query:query, projection:projection, "error getting project"
  58. return callback(err)
  59. callback(null, project?[0])
  60. getProjectIdByReadAndWriteToken: (token, callback=(err, project_id)->) ->
  61. Project.findOne {'tokens.readAndWrite': token}, {_id: 1}, (err, project) ->
  62. return callback err if err?
  63. return callback() unless project?
  64. callback null, project._id
  65. findAllUsersProjects: (
  66. user_id,
  67. fields,
  68. callback = (error, projects={owned: [], readAndWrite: [], readOnly: [], tokenReadAndWrite: [], tokenReadOnly: []}) ->
  69. ) ->
  70. CollaboratorsHandler = require "../Collaborators/CollaboratorsHandler"
  71. Project.find {owner_ref: user_id}, fields, (error, ownedProjects) ->
  72. return callback(error) if error?
  73. CollaboratorsHandler.getProjectsUserIsMemberOf user_id, fields, (error, projects) ->
  74. return callback(error) if error?
  75. result = {
  76. owned: ownedProjects || [],
  77. readAndWrite: projects.readAndWrite || [],
  78. readOnly: projects.readOnly || [],
  79. tokenReadAndWrite: projects.tokenReadAndWrite || [],
  80. tokenReadOnly: projects.tokenReadOnly || []
  81. }
  82. callback null, result
  83. [
  84. 'getProject',
  85. 'getProjectWithoutDocLines'
  86. ].map (method) ->
  87. metrics.timeAsyncMethod(ProjectGetter, method, 'mongo.ProjectGetter', logger)