diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 7b36465f9f..b30c2b8f91 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/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) -> diff --git a/services/web/app/coffee/Features/Project/ProjectGetter.coffee b/services/web/app/coffee/Features/Project/ProjectGetter.coffee index 129ff831dc..826ea4116c 100644 --- a/services/web/app/coffee/Features/Project/ProjectGetter.coffee +++ b/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 diff --git a/services/web/app/coffee/Features/Project/ProjectLocator.coffee b/services/web/app/coffee/Features/Project/ProjectLocator.coffee index fe60e0ba3e..0302bdc11b 100644 --- a/services/web/app/coffee/Features/Project/ProjectLocator.coffee +++ b/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)-> diff --git a/services/web/app/coffee/models/Project.coffee b/services/web/app/coffee/models/Project.coffee index 77fbdaf1d4..3a391adfc0 100644 --- a/services/web/app/coffee/models/Project.coffee +++ b/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" diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index 3ecb31ba68..186c2e9836 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/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)=> diff --git a/services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee index b8f1480be6..a107031c0b 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee +++ b/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 diff --git a/services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee index 5c36c18493..2bbcefd340 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee +++ b/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()