diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee index 4ab855af80..d574a0b263 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee @@ -6,8 +6,48 @@ logger = require('logger-sharelatex') UserGetter = require "../User/UserGetter" ContactManager = require "../Contacts/ContactManager" CollaboratorsEmailHandler = require "./CollaboratorsEmailHandler" +async = require "async" module.exports = CollaboratorsHandler = + getMemberIdsWithPrivilegeLevels: (project_id, callback = (error, members) ->) -> + Project.findOne { _id: project_id }, { collaberator_refs: 1, readOnly_refs: 1 }, (error, project) -> + return callback(error) if error? + return callback null, null if !project? + members = [] + for member_id in project.readOnly_refs or [] + members.push { id: member_id, privilegeLevel: "readOnly" } + for member_id in project.collaberator_refs or [] + members.push { id: member_id, privilegeLevel: "readAndWrite" } + return callback null, members + + getMembersWithPrivilegeLevels: (project_id, callback = (error, members) ->) -> + CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members) -> + return callback(error) if error? + async.mapLimit (members or []), 3, + (member, cb) -> + UserGetter.getUser member.id, (error, user) -> + return cb(error) if error? + return cb(null, { user: user, privilegeLevel: member.privilegeLevel }) + callback + + getMemberCount: (project_id, callback = (error, count) ->) -> + CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members) -> + return callback(error) if error? + return callback null, (members or []).length + + isUserMemberOfProject: (user_id, project_id, callback = (error, isMember, privilegeLevel) ->) -> + CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members) -> + return callback(error) if error? + for member in members or [] + if member.id.toString() == user_id.toString() + return callback null, true, member.privilegeLevel + return callback null, false, null + + getProjectsUserIsMemberOf: (user_id, fields, callback = (error, readAndWriteProjects, readOnlyProjects) ->) -> + Project.find {collaberator_refs:user_id}, fields, (err, readAndWriteProjects)=> + Project.find {readOnly_refs:user_id}, fields, (err, readOnlyProjects)=> + callback(err, readAndWriteProjects, readOnlyProjects) + removeUserFromProject: (project_id, user_id, callback = (error) ->)-> logger.log user_id: user_id, project_id: project_id, "removing user" conditions = _id:project_id diff --git a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsHandlerTests.coffee b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsHandlerTests.coffee index 1fd3a0c2d5..631559b84e 100644 --- a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsHandlerTests.coffee @@ -22,6 +22,93 @@ describe "CollaboratorsHandler", -> @adding_user_id = "adding-user-id" @email = "joe@sharelatex.com" @callback = sinon.stub() + + describe "getMemberIdsWithPrivilegeLevels", -> + beforeEach -> + @Project.findOne = sinon.stub() + @Project.findOne.withArgs({_id: @project_id}, {collaberator_refs: 1, readOnly_refs: 1}).yields(null, @project = { + readOnly_refs: [ "read-only-ref-1", "read-only-ref-2" ] + collaberator_refs: [ "read-write-ref-1", "read-write-ref-2" ] + }) + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels @project_id, @callback + + it "should return an array of member ids with their privilege levels", -> + @callback + .calledWith(null, [ + { id: "read-only-ref-1", privilegeLevel: "readOnly" } + { id: "read-only-ref-2", privilegeLevel: "readOnly" } + { id: "read-write-ref-1", privilegeLevel: "readAndWrite" } + { id: "read-write-ref-2", privilegeLevel: "readAndWrite" } + ]) + .should.equal true + + describe "getMembersWithPrivilegeLevels", -> + beforeEach -> + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels = sinon.stub() + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels.withArgs(@project_id).yields(null, [ + { id: "read-only-ref-1", privilegeLevel: "readOnly" } + { id: "read-only-ref-2", privilegeLevel: "readOnly" } + { id: "read-write-ref-1", privilegeLevel: "readAndWrite" } + { id: "read-write-ref-2", privilegeLevel: "readAndWrite" } + ]) + @UserGetter.getUser = sinon.stub() + @UserGetter.getUser.withArgs("read-only-ref-1").yields(null, { _id: "read-only-ref-1" }) + @UserGetter.getUser.withArgs("read-only-ref-2").yields(null, { _id: "read-only-ref-2" }) + @UserGetter.getUser.withArgs("read-write-ref-1").yields(null, { _id: "read-write-ref-1" }) + @UserGetter.getUser.withArgs("read-write-ref-2").yields(null, { _id: "read-write-ref-2" }) + @CollaboratorHandler.getMembersWithPrivilegeLevels @project_id, @callback + + it "should return an array of members with their privilege levels", -> + @callback + .calledWith(undefined, [ + { user: { _id: "read-only-ref-1" }, privilegeLevel: "readOnly" } + { user: { _id: "read-only-ref-2" }, privilegeLevel: "readOnly" } + { user: { _id: "read-write-ref-1" }, privilegeLevel: "readAndWrite" } + { user: { _id: "read-write-ref-2" }, privilegeLevel: "readAndWrite" } + ]) + .should.equal true + + describe "isUserMemberOfProject", -> + beforeEach -> + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels = sinon.stub() + + describe "when user is a member of the project", -> + beforeEach -> + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels.withArgs(@project_id).yields(null, [ + { id: "not-the-user", privilegeLevel: "readOnly" } + { id: @user_id, privilegeLevel: "readAndWrite" } + ]) + @CollaboratorHandler.isUserMemberOfProject @user_id, @project_id, @callback + + it "should return true and the privilegeLevel", -> + @callback + .calledWith(null, true, "readAndWrite") + .should.equal true + + describe "when user is not a member of the project", -> + beforeEach -> + @CollaboratorHandler.getMemberIdsWithPrivilegeLevels.withArgs(@project_id).yields(null, [ + { id: "not-the-user", privilegeLevel: "readOnly" } + ]) + @CollaboratorHandler.isUserMemberOfProject @user_id, @project_id, @callback + + it "should return false", -> + @callback + .calledWith(null, false, null) + .should.equal true + + describe "getProjectsUserIsMemberOf", -> + beforeEach -> + @fields = "mock fields" + @Project.find = sinon.stub() + @Project.find.withArgs({collaberator_refs:@user_id}, @fields).yields(null, ["mock-read-write-project-1", "mock-read-write-project-2"]) + @Project.find.withArgs({readOnly_refs:@user_id}, @fields).yields(null, ["mock-read-only-project-1", "mock-read-only-project-2"]) + @CollaboratorHandler.getProjectsUserIsMemberOf @user_id, @fields, @callback + + it "should call the callback with the projects", -> + @callback + .calledWith(null, ["mock-read-write-project-1", "mock-read-write-project-2"], ["mock-read-only-project-1", "mock-read-only-project-2"]) + .should.equal true describe "removeUserFromProject", -> beforeEach ->