Parcourir la source

Send project owner details to client

James Allen il y a 12 ans
Parent
commit
65a1f03768

+ 57 - 31
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
-	}

+ 2 - 2
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')

+ 22 - 5
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