Send project owner details to client

This commit is contained in:
James Allen 2014-06-16 13:34:38 +01:00
parent 9c5f63817e
commit 65a1f03768
3 changed files with 81 additions and 38 deletions

View file

@ -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
}

View file

@ -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')

View file

@ -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