Просмотр исходного кода

Move findAllUsersProjects from Project to ProjectGetter

James Allen 10 лет назад
Родитель
Сommit
1a689aa1fd

+ 2 - 1
services/web/app/coffee/Features/Project/ProjectController.coffee

@@ -17,6 +17,7 @@ SecurityManager = require("../../managers/SecurityManager")
 fs = require "fs"
 InactiveProjectManager = require("../InactiveData/InactiveProjectManager")
 ProjectUpdateHandler = require("./ProjectUpdateHandler")
+ProjectGetter = require("./ProjectGetter")
 
 module.exports = ProjectController =
 
@@ -129,7 +130,7 @@ module.exports = ProjectController =
 			notifications: (cb)->
 				NotificationsHandler.getUserNotifications user_id, cb
 			projects: (cb)->
-				Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel archived owner_ref', cb
+				ProjectGetter.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel archived owner_ref', cb
 			hasSubscription: (cb)->
 				LimitationsManager.userHasSubscriptionOrIsGroupMember req.session.user, cb
 			user: (cb) ->

+ 9 - 0
services/web/app/coffee/Features/Project/ProjectGetter.coffee

@@ -2,6 +2,8 @@ mongojs = require("../../infrastructure/mongojs")
 db = mongojs.db
 ObjectId = mongojs.ObjectId
 async = require "async"
+Project = require("../../models/Project").Project
+CollaboratorsHandler = require "../Collaborators/CollaboratorsHandler"
 
 module.exports = ProjectGetter =
 	EXCLUDE_DEPTH: 8
@@ -27,6 +29,13 @@ module.exports = ProjectGetter =
 		else if query instanceof ObjectId
 			query = _id: query
 		db.projects.findOne query, projection, callback
+	
+	findAllUsersProjects: (user_id, fields, callback = (error, ownedProjects, readAndWriteProjects, readOnlyProjects) ->) ->
+		Project.find {owner_ref: user_id}, fields, (error, projects) ->
+			return callback(error) if error?
+			CollaboratorsHandler.getProjectsUserIsMemberOf user_id, fields, (error, readAndWriteProjects, readOnlyProjects) ->
+				return callback(error) if error?
+				callback null, projects, readAndWriteProjects, readOnlyProjects
 
 	populateProjectWithUsers: (project, callback=(error, project) ->) ->
 		# eventually this should be in a UserGetter.getUser module

+ 3 - 1
services/web/app/coffee/Features/Project/ProjectLocator.coffee

@@ -3,6 +3,7 @@ Errors = require "../../errors"
 _ = require('underscore')
 logger = require('logger-sharelatex')
 async = require('async')
+ProjectGetter = require "./ProjectGetter"
 
 module.exports =
 	findElement: (options, _callback = (err, element, path, parentFolder)->)->
@@ -126,7 +127,8 @@ module.exports =
 			async.waterfall jobs, callback
 
 	findUsersProjectByName: (user_id, projectName, callback)->
-		Project.findAllUsersProjects user_id, 'name archived', (err, projects, collabertions=[])->
+		ProjectGetter.findAllUsersProjects user_id, 'name archived', (err, projects, collabertions=[])->
+			return callback(error) if error?
 			projects = projects.concat(collabertions)
 			projectName = projectName.toLowerCase()
 			project = _.find projects, (project)->

+ 0 - 6
services/web/app/coffee/models/Project.coffee

@@ -60,12 +60,6 @@ ProjectSchema.statics.findPopulatedById = (project_id, callback)->
 					logger.log project_id:project_id, "finished findPopulatedById"
 					callback(null, projects[0])
 
-ProjectSchema.statics.findAllUsersProjects = (user_id, requiredFields, callback)->
-	this.find {owner_ref:user_id}, requiredFields, (err, projects)=>
-		this.find {collaberator_refs:user_id}, requiredFields, (err, collabertions)=>
-			this.find {readOnly_refs:user_id}, requiredFields, (err, readOnlyProjects)=>
-				callback(err, projects, collabertions, readOnlyProjects)
-
 sanitizeTypeOfElement = (elementType)->
 	lastChar = elementType.slice -1
 	if lastChar != "s"

+ 4 - 2
services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee

@@ -36,7 +36,6 @@ describe "ProjectController", ->
 		@NotificationsHandler =
 			getUserNotifications: sinon.stub()
 		@ProjectModel =
-			findAllUsersProjects: sinon.stub()
 			findPopulatedById: sinon.stub()
 		@UserModel =
 			findById: sinon.stub()
@@ -50,6 +49,8 @@ describe "ProjectController", ->
 			markAsOpened: sinon.stub()
 		@ReferencesSearchHandler =
 			indexProjectReferences: sinon.stub()
+		@ProjectGetter =
+			findAllUsersProjects: sinon.stub()
 		@ProjectController = SandboxedModule.require modulePath, requires:
 			"settings-sharelatex":@settings
 			"logger-sharelatex": 
@@ -69,6 +70,7 @@ describe "ProjectController", ->
 			"../InactiveData/InactiveProjectManager":@InactiveProjectManager
 			"./ProjectUpdateHandler":@ProjectUpdateHandler
 			"../ReferencesSearch/ReferencesSearchHandler": @ReferencesSearchHandler
+			"./ProjectGetter": @ProjectGetter
 
 		@user = 
 			_id:"!£123213kjljkl"
@@ -220,7 +222,7 @@ describe "ProjectController", ->
 			@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false)
 			@TagsHandler.getAllTags.callsArgWith(1, null, @tags, {})
 			@NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {})
-			@ProjectModel.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly)
+			@ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly)
 
 		it "should render the project/list page", (done)->
 			@res.render = (pageName, opts)=>

+ 16 - 1
services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee

@@ -16,6 +16,8 @@ describe "ProjectGetter", ->
 					projects: {}
 					users: {}
 				ObjectId: ObjectId
+			"../../models/Project": Project: @Project = {}
+			"../Collaborators/CollaboratorsHandler": @CollaboratorsHandler = {}
 
 	describe "getProjectWithoutDocLines", ->
 		beforeEach ->
@@ -111,4 +113,17 @@ describe "ProjectGetter", ->
 
 		it "should call the callback", ->
 			assert.deepEqual @callback.args[0][1], @project
-					
+			
+	describe "findAllUsersProjects", ->
+		beforeEach ->
+			@fields = {"mock": "fields"}
+			@Project.find = sinon.stub()
+			@Project.find.withArgs({owner_ref: @user_id}, @fields).yields(null, ["mock-owned-projects"])
+			@CollaboratorsHandler.getProjectsUserIsMemberOf = sinon.stub()
+			@CollaboratorsHandler.getProjectsUserIsMemberOf.withArgs(@user_id, @fields).yields(null, ["mock-rw-projects"], ["mock-ro-projects"])
+			@ProjectGetter.findAllUsersProjects @user_id, @fields, @callback
+		
+		it "should call the callback with all the projects", ->
+			@callback
+				.calledWith(null, ["mock-owned-projects"], ["mock-rw-projects"], ["mock-ro-projects"])
+				.should.equal true

+ 5 - 4
services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee

@@ -30,7 +30,7 @@ project.rootFolder[0] = rootFolder
 project.rootDoc_id = rootDoc._id
 
 
-describe 'project model', ->
+describe 'ProjectLocator', ->
 
 	beforeEach ->
 		Project.getProject = (project_id, fields, callback)=>
@@ -41,6 +41,7 @@ describe 'project model', ->
 		@locator = SandboxedModule.require modulePath, requires:
 			'../../models/Project':{Project:Project}
 			'../../models/User':{User:@User}
+			'./ProjectGetter': @ProjectGetter = {}
 			'logger-sharelatex':
 				log:->
 				err:->
@@ -298,7 +299,7 @@ describe 'project model', ->
 			user_id = "123jojoidns"
 			stubbedProject = {name:"findThis"}
 			projects = [{name:"notThis"}, {name:"wellll"}, stubbedProject, {name:"Noooo"}]	
-			Project.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects)
+			@ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects)
 			@locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)->
 				project.should.equal stubbedProject
 				done()
@@ -307,7 +308,7 @@ describe 'project model', ->
 			user_id = "123jojoidns"
 			stubbedProject = {name:"findThis", _id:12331321}
 			projects = [{name:"notThis"}, {name:"wellll"}, {name:"findThis",archived:true}, stubbedProject, {name:"findThis",archived:true}, {name:"Noooo"}]	
-			Project.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects)
+			@ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects)
 			@locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)->
 				project._id.should.equal stubbedProject._id
 				done()
@@ -316,7 +317,7 @@ describe 'project model', ->
 			user_id = "123jojoidns"
 			stubbedProject = {name:"findThis"}
 			projects = [{name:"notThis"}, {name:"wellll"}, {name:"Noooo"}]	
-			Project.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects, [stubbedProject])
+			@ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects, [stubbedProject])
 			@locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)->
 				project.should.equal stubbedProject
 				done()