diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 928f52d4a9..f7b76f931d 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -151,7 +151,7 @@ module.exports = ProjectController = notifications = require("underscore").map results.notifications, (notification)-> notification.html = req.i18n.translate(notification.templateKey, notification.messageOpts) return notification - projects = ProjectController._buildProjectList results.projects[0], results.projects[1], results.projects[2], results.projects[3], results.projects[4] + projects = ProjectController._buildProjectList results.projects user = results.user ProjectController._injectProjectOwners projects, (error, projects) -> return next(error) if error? @@ -309,22 +309,23 @@ module.exports = ProjectController = maxDocLength: Settings.max_doc_length timer.done() - _buildProjectList: (ownedProjects, readAndWriteProjects, readOnlyProjects, tokenReadAndWriteProjects, tokenReadOnlyProjects)-> + _buildProjectList: (allProjects)-> + {owned, readAndWrite, readOnly, tokenReadAndWrite, tokenReadOnly} = allProjects projects = [] - for project in ownedProjects + for project in owned projects.push ProjectController._buildProjectViewModel(project, "owner", Sources.OWNER) # Invite-access - for project in readAndWriteProjects + for project in readAndWrite projects.push ProjectController._buildProjectViewModel(project, "readWrite", Sources.INVITE) - for project in readOnlyProjects + for project in readOnly projects.push ProjectController._buildProjectViewModel(project, "readOnly", Sources.INVITE) # Token-access # Only add these projects if they're not already present, this gives us cascading access # from 'owner' => 'token-read-only' - for project in tokenReadAndWriteProjects + for project in tokenReadAndWrite if projects.filter((p) -> p.id.toString() == project._id.toString()).length == 0 projects.push ProjectController._buildProjectViewModel(project, "readAndWrite", Sources.TOKEN) - for project in tokenReadOnlyProjects + for project in tokenReadOnly if projects.filter((p) -> p.id.toString() == project._id.toString()).length == 0 projects.push ProjectController._buildProjectViewModel(project, "readOnly", Sources.TOKEN) diff --git a/services/web/app/coffee/Features/Project/ProjectGetter.coffee b/services/web/app/coffee/Features/Project/ProjectGetter.coffee index bcc597a763..fb4e30fd2c 100644 --- a/services/web/app/coffee/Features/Project/ProjectGetter.coffee +++ b/services/web/app/coffee/Features/Project/ProjectGetter.coffee @@ -50,14 +50,24 @@ module.exports = ProjectGetter = return callback(err) callback(null, project?[0]) - findAllUsersProjects: (user_id, fields, callback = (error, ownedProjects, readAndWriteProjects, readOnlyProjects, tokenReadAndWrite, tokenReadOnly) ->) -> + findAllUsersProjects: ( + user_id, + fields, + callback = (error, projects={owned: [], readAndWrite: [], readOnly: [], tokenReadAndWrite: [], tokenReadOnly: []}) -> + ) -> CollaboratorsHandler = require "../Collaborators/CollaboratorsHandler" Project.find {owner_ref: user_id}, fields, (error, ownedProjects) -> return callback(error) if error? CollaboratorsHandler.getProjectsUserIsMemberOf user_id, fields, (error, projects) -> return callback(error) if error? - callback null, ownedProjects, projects.readAndWrite, projects.readOnly, projects.tokenReadAndWrite, projects.tokenReadOnly - + result = { + owned: ownedProjects || [], + readAndWrite: projects.readAndWrite || [], + readOnly: projects.readOnly || [], + tokenReadAndWrite: projects.tokenReadAndWrite || [], + tokenReadOnly: projects.tokenReadOnly || [] + } + callback null, result [ 'getProject', diff --git a/services/web/app/coffee/Features/Project/ProjectLocator.coffee b/services/web/app/coffee/Features/Project/ProjectLocator.coffee index 62b495e5d2..cb1bcf55ee 100644 --- a/services/web/app/coffee/Features/Project/ProjectLocator.coffee +++ b/services/web/app/coffee/Features/Project/ProjectLocator.coffee @@ -150,9 +150,10 @@ module.exports = ProjectLocator = async.waterfall jobs, callback findUsersProjectByName: (user_id, projectName, callback)-> - ProjectGetter.findAllUsersProjects user_id, 'name archived', (err, projects, collabertions=[])-> + ProjectGetter.findAllUsersProjects user_id, 'name archived', (err, allProjects)-> return callback(error) if error? - projects = projects.concat(collabertions) + {owned, readAndWrite} = allProjects + projects = owned.concat(readAndWrite) projectName = projectName.toLowerCase() project = _.find projects, (project)-> project.name.toLowerCase() == projectName and project.archived != true diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index d207aab3cb..9abfb71c1e 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -239,6 +239,13 @@ describe "ProjectController", -> @tokenReadOnly = [ {_id:7, lastUpdated:4, owner_ref: "user-5"} ] + @allProjects = { + owned: @projects, + readAndWrite: @collabertions, + readOnly: @readOnly, + tokenReadAndWrite: @tokenReadAndWrite, + tokenReadOnly: @tokenReadOnly + } @users = 'user-1': @@ -252,7 +259,7 @@ describe "ProjectController", -> @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false) @TagsHandler.getAllTags.callsArgWith(1, null, @tags, {}) @NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {}) - @ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly, @tokenReadAndWrite, @tokenReadOnly) + @ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects) it "should render the project/list page", (done)-> @res.render = (pageName, opts)=> @@ -307,6 +314,13 @@ describe "ProjectController", -> {_id:6, lastUpdated:5, owner_ref: "user-4"} # Also in tokenReadAndWrite {_id:7, lastUpdated:4, owner_ref: "user-5"} ] + @allProjects = { + owned: @projects, + readAndWrite: @collabertions, + readOnly: @readOnly, + tokenReadAndWrite: @tokenReadAndWrite, + tokenReadOnly: @tokenReadOnly + } @users = 'user-1': @@ -320,7 +334,7 @@ describe "ProjectController", -> @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false) @TagsHandler.getAllTags.callsArgWith(1, null, @tags, {}) @NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {}) - @ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly, @tokenReadAndWrite, @tokenReadOnly) + @ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects) 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 256de181a9..abc0842f76 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectGetterTests.coffee @@ -152,12 +152,21 @@ describe "ProjectGetter", -> @CollaboratorsHandler.getProjectsUserIsMemberOf.withArgs(@user_id, @fields).yields( null, { - readAndWrite: ["mock-rw-projects"], readOnly: ["mock-ro-projects"] + readAndWrite: ["mock-rw-projects"], + readOnly: ["mock-ro-projects"], + tokenReadAndWrite: ['mock-token-rw-projects'], + tokenReadOnly: ['mock-token-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"]) + .calledWith(null, { + owned: ["mock-owned-projects"], + readAndWrite: ["mock-rw-projects"], + readOnly: ["mock-ro-projects"] + tokenReadAndWrite: ['mock-token-rw-projects'], + tokenReadOnly: ['mock-token-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 3d9808503b..3e94a4f23e 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectLocatorTests.coffee @@ -317,7 +317,9 @@ describe 'ProjectLocator', -> it 'should return the project from an array case insenstive', (done)-> user_id = "123jojoidns" stubbedProject = {name:"findThis"} - projects = [{name:"notThis"}, {name:"wellll"}, stubbedProject, {name:"Noooo"}] + projects = { + owned: [{name:"notThis"}, {name:"wellll"}, stubbedProject, {name:"Noooo"}] + } @ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects) @locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)-> project.should.equal stubbedProject @@ -326,7 +328,16 @@ describe 'ProjectLocator', -> it 'should return the project which is not archived', (done)-> user_id = "123jojoidns" stubbedProject = {name:"findThis", _id:12331321} - projects = [{name:"notThis"}, {name:"wellll"}, {name:"findThis",archived:true}, stubbedProject, {name:"findThis",archived:true}, {name:"Noooo"}] + projects = { + owned: [ + {name:"notThis"}, + {name:"wellll"}, + {name:"findThis",archived:true}, + stubbedProject, + {name:"findThis",archived:true}, + {name:"Noooo"} + ] + } @ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects) @locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)-> project._id.should.equal stubbedProject._id @@ -335,8 +346,11 @@ describe 'ProjectLocator', -> it 'should search collab projects as well', (done)-> user_id = "123jojoidns" stubbedProject = {name:"findThis"} - projects = [{name:"notThis"}, {name:"wellll"}, {name:"Noooo"}] - @ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects, [stubbedProject]) + projects = { + owned: [{name:"notThis"}, {name:"wellll"}, {name:"Noooo"}] + readAndWrite: [stubbedProject] + } + @ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, projects) @locator.findUsersProjectByName user_id, stubbedProject.name.toLowerCase(), (err, project)-> project.should.equal stubbedProject done()