From 5c3e8e6d88d2bb8465af6e108bea0249ef24bd51 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 6 Nov 2014 11:53:59 +0000 Subject: [PATCH] Add and remove collaborators with HTTP requests, not websockets --- .../Features/Editor/EditorController.coffee | 10 +++--- .../Editor/EditorHttpController.coffee | 15 +++++++- .../Features/Editor/EditorRouter.coffee | 19 +++++++++++ services/web/app/coffee/router.coffee | 15 ++------ .../ShareProjectModalController.coffee | 10 +++--- .../ide/share/services/projectMembers.coffee | 33 +++++++----------- .../Editor/EditorHttpControllerTests.coffee | 34 +++++++++++++++++++ 7 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 services/web/app/coffee/Features/Editor/EditorRouter.coffee diff --git a/services/web/app/coffee/Features/Editor/EditorController.coffee b/services/web/app/coffee/Features/Editor/EditorController.coffee index 9f6586df50..07b9588bcf 100644 --- a/services/web/app/coffee/Features/Editor/EditorController.coffee +++ b/services/web/app/coffee/Features/Editor/EditorController.coffee @@ -150,15 +150,17 @@ module.exports = EditorController = callback null, false else CollaboratorsHandler.addUserToProject project_id, email, privileges, (err, user)=> + return callback(err) if error? + # Flush to TPDS to add files to collaborator's Dropbox ProjectEntityHandler.flushProjectToThirdPartyDataStore project_id, -> EditorRealTimeController.emitToRoom(project_id, 'userAddedToProject', user, privileges) callback null, ProjectEditorHandler.buildUserModelView(user, privileges) - removeUserFromProject: (project_id, user_id, callback)-> - CollaboratorsHandler.removeUserFromProject project_id, user_id, => + removeUserFromProject: (project_id, user_id, callback = (error) ->)-> + CollaboratorsHandler.removeUserFromProject project_id, user_id, (error) => + return callback(error) if error? EditorRealTimeController.emitToRoom(project_id, 'userRemovedFromProject', user_id) - if callback? - callback() + callback() setDoc: (project_id, doc_id, docLines, source, callback = (err)->)-> DocumentUpdaterHandler.setDocument project_id, doc_id, docLines, source, (err)=> diff --git a/services/web/app/coffee/Features/Editor/EditorHttpController.coffee b/services/web/app/coffee/Features/Editor/EditorHttpController.coffee index 97f61e9b86..e025494a94 100644 --- a/services/web/app/coffee/Features/Editor/EditorHttpController.coffee +++ b/services/web/app/coffee/Features/Editor/EditorHttpController.coffee @@ -76,5 +76,18 @@ module.exports = EditorHttpController = EditorController.deleteEntity project_id, entity_id, entity_type, "editor", (error) -> return next(error) if error? res.send 204 - + + addUserToProject: (req, res, next) -> + project_id = req.params.Project_id + {email, privileges} = req.body + EditorController.addUserToProject project_id, email, privileges, (error, user) -> + return next(error) if error? + res.json user: user + + removeUserFromProject: (req, res, next) -> + project_id = req.params.Project_id + user_id = req.params.user_id + EditorController.removeUserFromProject project_id, user_id, (error)-> + return next(error) if error? + res.send 204 diff --git a/services/web/app/coffee/Features/Editor/EditorRouter.coffee b/services/web/app/coffee/Features/Editor/EditorRouter.coffee new file mode 100644 index 0000000000..94ce4da303 --- /dev/null +++ b/services/web/app/coffee/Features/Editor/EditorRouter.coffee @@ -0,0 +1,19 @@ +EditorHttpController = require('./EditorHttpController') +SecurityManager = require('../../managers/SecurityManager') + +module.exports = + apply: (app) -> + app.post '/project/:Project_id/doc', SecurityManager.requestCanModifyProject, EditorHttpController.addDoc + app.post '/project/:Project_id/folder', SecurityManager.requestCanModifyProject, EditorHttpController.addFolder + + app.post '/project/:Project_id/:entity_type/:entity_id/rename', SecurityManager.requestCanModifyProject, EditorHttpController.renameEntity + app.post '/project/:Project_id/:entity_type/:entity_id/move', SecurityManager.requestCanModifyProject, EditorHttpController.moveEntity + + app.delete '/project/:Project_id/file/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteFile + app.delete '/project/:Project_id/doc/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteDoc + app.delete '/project/:Project_id/folder/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteFolder + + app.post '/project/:Project_id/doc/:doc_id/restore', SecurityManager.requestCanModifyProject, EditorHttpController.restoreDoc + + app.post '/project/:Project_id/users', SecurityManager.requestIsOwner, EditorHttpController.addUserToProject + app.delete '/project/:Project_id/users/:user_id', SecurityManager.requestIsOwner, EditorHttpController.removeUserFromProject diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 250312a5d0..ee16332351 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -6,7 +6,7 @@ SpellingController = require('./Features/Spelling/SpellingController') SecurityManager = require('./managers/SecurityManager') AuthorizationManager = require('./Features/Security/AuthorizationManager') EditorController = require("./Features/Editor/EditorController") -EditorHttpController = require("./Features/Editor/EditorHttpController") +EditorRouter = require("./Features/Editor/EditorRouter") EditorUpdatesController = require("./Features/Editor/EditorUpdatesController") Settings = require('settings-sharelatex') TpdsController = require('./Features/ThirdPartyDataStore/TpdsController') @@ -62,6 +62,7 @@ module.exports = class Router app.get '/register', UserPagesController.registerPage app.post '/register', UserController.register + EditorRouter.apply(app) SubscriptionRouter.apply(app) UploadsRouter.apply(app) PasswordResetRouter.apply(app) @@ -98,16 +99,6 @@ module.exports = class Router app.post '/project/:Project_id/settings', SecurityManager.requestCanModifyProject, ProjectController.updateProjectSettings - app.post '/project/:Project_id/doc', SecurityManager.requestCanModifyProject, EditorHttpController.addDoc - app.post '/project/:Project_id/folder', SecurityManager.requestCanModifyProject, EditorHttpController.addFolder - - app.post '/project/:Project_id/:entity_type/:entity_id/rename', SecurityManager.requestCanModifyProject, EditorHttpController.renameEntity - app.post '/project/:Project_id/:entity_type/:entity_id/move', SecurityManager.requestCanModifyProject, EditorHttpController.moveEntity - - app.delete '/project/:Project_id/file/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteFile - app.delete '/project/:Project_id/doc/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteDoc - app.delete '/project/:Project_id/folder/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteFolder - app.post '/project/:Project_id/compile', SecurityManager.requestCanAccessProject, CompileController.compile app.get '/Project/:Project_id/output/output.pdf', SecurityManager.requestCanAccessProject, CompileController.downloadPdf app.get /^\/project\/([^\/]*)\/output\/(.*)$/, @@ -133,8 +124,6 @@ module.exports = class Router app.get "/project/:Project_id/doc/:doc_id/diff", SecurityManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi app.post "/project/:Project_id/doc/:doc_id/version/:version_id/restore", SecurityManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi - app.post "/project/:Project_id/doc/:doc_id/restore", SecurityManager.requestCanAccessProject, EditorHttpController.restoreDoc - app.post '/project/:project_id/leave', AuthenticationController.requireLogin(), CollaboratorsController.removeSelfFromProject app.get '/project/:Project_id/collaborators', SecurityManager.requestCanAccessProject(allow_auth_token: true), CollaboratorsController.getCollaborators diff --git a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee index cc2236f0bf..225a841a6a 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee @@ -28,11 +28,11 @@ define [ $scope.state.inflight = true projectMembers .addMember($scope.inputs.email, $scope.inputs.privileges) - .then (user) -> + .success (data) -> $scope.state.inflight = false $scope.inputs.email = "" - $scope.project.members.push user - .catch () -> + $scope.project.members.push data?.user + .error () -> $scope.state.inflight = false $scope.state.error = "Sorry, something went wrong :(" @@ -42,12 +42,12 @@ define [ $scope.state.inflight = true projectMembers .removeMember(member) - .then () -> + .success () -> $scope.state.inflight = false index = $scope.project.members.indexOf(member) return if index == -1 $scope.project.members.splice(index, 1) - .catch () -> + .error () -> $scope.state.inflight = false $scope.state.error = "Sorry, something went wrong :(" diff --git a/services/web/public/coffee/ide/share/services/projectMembers.coffee b/services/web/public/coffee/ide/share/services/projectMembers.coffee index 144a6c2684..d6ef16187e 100644 --- a/services/web/public/coffee/ide/share/services/projectMembers.coffee +++ b/services/web/public/coffee/ide/share/services/projectMembers.coffee @@ -1,30 +1,21 @@ define [ "base" ], (App) -> - App.factory "projectMembers", ["ide", "$q", (ide, $q) -> + App.factory "projectMembers", ["ide", "$http", (ide, $http) -> return { removeMember: (member) -> - deferred = $q.defer() - - ide.socket.emit "removeUserFromProject", member._id, (error) => - if error? - return deferred.reject(error) - deferred.resolve() - - return deferred.promise + $http({ + url: "/project/#{ide.project_id}/users/#{member._id}" + method: "DELETE" + headers: + "X-Csrf-Token": window.csrfToken + }) addMember: (email, privileges) -> - deferred = $q.defer() - - ide.socket.emit "addUserToProject", email, privileges, (error, user) => - if error? - return deferred.reject(error) - - if !user - deferred.reject() - else - deferred.resolve(user) - - return deferred.promise + $http.post("/project/#{ide.project_id}/users", { + email: email + privileges: privileges + _csrf: window.csrfToken + }) } ] \ No newline at end of file diff --git a/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee b/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee index dda8a5fed8..cb24cebcb1 100644 --- a/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee @@ -157,3 +157,37 @@ describe "EditorHttpController", -> it "should send back a success response", -> @res.send.calledWith(204).should.equal true + + describe "addUserToProject", -> + beforeEach -> + @req.params = + Project_id: @project_id + @req.body = + email: @email = "joe@example.com" + privileges: @privileges = "readAndWrite" + @EditorController.addUserToProject = sinon.stub().callsArgWith(3, null, @user = {"mock": "user"}) + @EditorHttpController.addUserToProject @req, @res + + it "should add the user to the project", -> + @EditorController.addUserToProject + .calledWith(@project_id, @email, @privileges) + .should.equal true + + it "should send the back the added user", -> + @res.json.calledWith(user: @user).should.equal true + + describe "removeUserFromProject", -> + beforeEach -> + @req.params = + Project_id: @project_id + user_id: @user_id = "user-id-123" + @EditorController.removeUserFromProject = sinon.stub().callsArg(2) + @EditorHttpController.removeUserFromProject @req, @res + + it "should from the user from the project", -> + @EditorController.removeUserFromProject + .calledWith(@project_id, @user_id) + .should.equal true + + it "should send the back a success response", -> + @res.send.calledWith(204).should.equal true