diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index d99d307b59..7ea708982b 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -14,7 +14,7 @@ _ = require("underscore") Settings = require("settings-sharelatex") SecurityManager = require("../../managers/SecurityManager") -module.exports = +module.exports = ProjectController = deleteProject: (req, res) -> project_id = req.params.Project_id @@ -92,15 +92,23 @@ module.exports = tags: (cb)-> TagsHandler.getAllTags user_id, cb projects: (cb)-> - Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel archived', cb + Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel archived owner_ref', cb }, (err, results)-> if err? logger.err err:err, "error getting data for project list page" - return res.send 500 + return next(err) logger.log results:results, user_id:user_id, "rendering project list" - viewModel = _buildListViewModel results.projects[0], results.projects[1], results.projects[2], results.tags[0], results.tags[1] - res.render 'project/list', viewModel - timer.done() + tags = results.tags[0] + projects = ProjectController._buildProjectList results.projects[0], results.projects[1], results.projects[2] + ProjectController._injectProjectOwners projects, (error, projects) -> + return next(error) if error? + res.render 'project/list', { + title:'Your Projects' + priority_title: true + projects: projects + tags: tags + } + timer.done() loadEditor: (req, res, next)-> timer = new metrics.Timer("load-editor") @@ -179,6 +187,49 @@ module.exports = languages: Settings.languages timer.done() + _buildProjectList: (ownedProjects, sharedProjects, readOnlyProjects)-> + projects = [] + for project in ownedProjects + projects.push ProjectController._buildProjectViewModel(project, "owner") + for project in sharedProjects + projects.push ProjectController._buildProjectViewModel(project, "readWrite") + for project in readOnlyProjects + projects.push ProjectController._buildProjectViewModel(project, "readOnly") + + return projects + + _buildProjectViewModel: (project, accessLevel) -> + { + id: project._id + name: project.name + lastUpdated: project.lastUpdated + publicAccessLevel: project.publicAccesLevel + accessLevel: accessLevel + archived: !!project.archived + owner_ref: project.owner_ref + } + + _injectProjectOwners: (projects, callback = (error, projects) ->) -> + users = {} + for project in projects + if project.owner_ref? + users[project.owner_ref.toString()] = true + + jobs = [] + for user_id, _ of users + do (user_id) -> + jobs.push (callback) -> + User.findById user_id, "first_name last_name", (error, user) -> + return callback(error) if error? + users[user_id] = user + callback() + + async.series jobs, (error) -> + for project in projects + if project.owner_ref? + project.owner = users[project.owner_ref.toString()] + callback null, projects + defaultSettingsForAnonymousUser = (user_id)-> id : user_id ace: @@ -195,28 +246,3 @@ defaultSettingsForAnonymousUser = (user_id)-> dropbox: false trackChanges: false -_buildListViewModel = (ownedProjects, sharedProjects, readOnlyProjects, tags, tagsGroupedByProject)-> - projects = [] - for project in ownedProjects - projects.push _buildProjectViewModel(project, "owner") - for project in sharedProjects - projects.push _buildProjectViewModel(project, "readWrite") - for project in readOnlyProjects - projects.push _buildProjectViewModel(project, "readOnly") - - return { - title:'Your Projects' - priority_title: true - projects: JSON.stringify(projects) - tags: JSON.stringify(tags) - projectTabActive: true - } - -_buildProjectViewModel = (project, accessLevel) -> - { - id: project._id - name: project.name - lastUpdated: project.lastUpdated - publicAccessLevel: project.publicAccesLevel - accessLevel: accessLevel - } diff --git a/services/web/app/views/project/list.jade b/services/web/app/views/project/list.jade index 04be9439d3..8b11afea45 100644 --- a/services/web/app/views/project/list.jade +++ b/services/web/app/views/project/list.jade @@ -3,8 +3,8 @@ extends ../layout block scripts script(type="text/javascript"). window.data = { - projects: !{projects}, - tags: !{tags} + projects: !{JSON.stringify(projects)}, + tags: !{JSON.stringify(tags)} }; script(src=jsPath+'libs/fineuploader.js') diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index 1ac388ed80..600b4cf886 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -125,9 +125,19 @@ describe "ProjectController", -> beforeEach -> @tags = [{name:1, project_ids:["1","2","3"]}, {name:2, project_ids:["a","1"]}, {name:3, project_ids:["a", "b", "c", "d"]}] - @projects = [{lastUpdated:1, _id:1}, {lastUpdated:2, _id:2}] - @collabertions = [{lastUpdated:5, _id:5}] - @readOnly = [{lastUpdated:3, _id:3}] + @projects = [{lastUpdated:1, _id:1, owner_ref: "user-1"}, {lastUpdated:2, _id:2, owner_ref: "user-2"}] + @collabertions = [{lastUpdated:5, _id:5, owner_ref: "user-1"}] + @readOnly = [{lastUpdated:3, _id:3, owner_ref: "user-1"}] + + @users = + 'user-1': + first_name: 'James' + 'user-2': + first_name: 'Henry' + @UserModel.findById = (id, fields, callback) => + fields.should.equal 'first_name last_name' + callback null, @users[id] + @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, {}) @TagsHandler.getAllTags.callsArgWith(1, null, @tags, {}) @ProjectModel.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly) @@ -140,13 +150,20 @@ describe "ProjectController", -> it "should send the tags", (done)-> @res.render = (pageName, opts)=> - JSON.parse(opts.tags).length.should.equal @tags.length + opts.tags.length.should.equal @tags.length done() @ProjectController.projectListPage @req, @res it "should send the projects", (done)-> @res.render = (pageName, opts)=> - JSON.parse(opts.projects).length.should.equal (@projects.length + @collabertions.length + @readOnly.length) + opts.projects.length.should.equal (@projects.length + @collabertions.length + @readOnly.length) + done() + @ProjectController.projectListPage @req, @res + + it "should inject the users", (done) -> + @res.render = (pageName, opts)=> + opts.projects[0].owner.should.equal (@users[@projects[0].owner_ref]) + opts.projects[1].owner.should.equal (@users[@projects[1].owner_ref]) done() @ProjectController.projectListPage @req, @res