From dca1c9be5dc707d4484dddb614440d0e7a27b20e Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Mon, 1 Aug 2016 17:05:37 +0100 Subject: [PATCH] Load invites on project load, rather than asynchronously. --- .../CollaboratorsInviteController.coffee | 2 +- .../CollaboratorsInviteHandler.coffee | 2 +- .../Editor/EditorHttpController.coffee | 19 ++++++++++--------- .../Project/ProjectEditorHandler.coffee | 5 +++-- .../web/app/views/project/editor/share.jade | 2 +- .../ShareProjectModalController.coffee | 15 +++------------ .../ide/share/services/projectMembers.coffee | 7 ------- .../Editor/EditorHttpControllerTests.coffee | 13 ++++++++++++- .../Project/ProjectEditorHandlerTests.coffee | 10 +++++++++- 9 files changed, 40 insertions(+), 35 deletions(-) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee index f86d46e151..93c84f4614 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee @@ -95,7 +95,7 @@ module.exports = CollaboratorsInviteController = inviteId = req.params.invite_id {token} = req.body currentUser = req.session.user - logger.log {projectId, inviteId}, "accepting invite" + logger.log {projectId, inviteId, userId: currentUser._id}, "accepting invite" CollaboratorsInviteHandler.acceptInvite projectId, inviteId, token, currentUser, (err) -> if err? logger.err {projectId, inviteId}, "error accepting invite by token" diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index 8118f7b135..c83433e880 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -54,7 +54,7 @@ module.exports = CollaboratorsInviteHandler = if err? logger.err {err, projectId}, "error fetching invite" return callback(err) - if !invite + if !invite? logger.err {err, projectId, token: tokenString}, "no invite found" return callback(null, null) callback(null, invite) diff --git a/services/web/app/coffee/Features/Editor/EditorHttpController.coffee b/services/web/app/coffee/Features/Editor/EditorHttpController.coffee index 379f20fe5b..f467d7a9bf 100644 --- a/services/web/app/coffee/Features/Editor/EditorHttpController.coffee +++ b/services/web/app/coffee/Features/Editor/EditorHttpController.coffee @@ -9,6 +9,7 @@ AuthorizationManager = require("../Authorization/AuthorizationManager") ProjectEditorHandler = require('../Project/ProjectEditorHandler') Metrics = require('../../infrastructure/Metrics') CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler") +CollaboratorsInviteHandler = require("../Collaborators/CollaboratorsInviteHandler") PrivilegeLevels = require "../Authorization/PrivilegeLevels" module.exports = EditorHttpController = @@ -39,13 +40,15 @@ module.exports = EditorHttpController = return callback(error) if error? AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) -> return callback(error) if error? - if !privilegeLevel? or privilegeLevel == PrivilegeLevels.NONE - callback null, null, false - else - callback(null, - ProjectEditorHandler.buildProjectModelView(project, members), - privilegeLevel - ) + CollaboratorsInviteHandler.getAllInvites project_id, (error, invites) -> + return callback(error) if error? + if !privilegeLevel? or privilegeLevel == PrivilegeLevels.NONE + callback null, null, false + else + callback(null, + ProjectEditorHandler.buildProjectModelView(project, members, invites), + privilegeLevel + ) restoreDoc: (req, res, next) -> project_id = req.params.Project_id @@ -135,5 +138,3 @@ module.exports = EditorHttpController = EditorController.deleteEntity project_id, entity_id, entity_type, "editor", (error) -> return next(error) if error? res.sendStatus 204 - - diff --git a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee index 4e4991a855..28d637eab6 100644 --- a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee @@ -1,7 +1,7 @@ _ = require("underscore") module.exports = ProjectEditorHandler = - buildProjectModelView: (project, members) -> + buildProjectModelView: (project, members, invites) -> result = _id : project._id name : project.name @@ -15,7 +15,8 @@ module.exports = ProjectEditorHandler = deletedByExternalDataSource : project.deletedByExternalDataSource || false deletedDocs: project.deletedDocs members: [] - + invites: invites || [] + owner = null for member in members if member.privilegeLevel == "owner" diff --git a/services/web/app/views/project/editor/share.jade b/services/web/app/views/project/editor/share.jade index 8de9af28d2..a39f66055f 100644 --- a/services/web/app/views/project/editor/share.jade +++ b/services/web/app/views/project/editor/share.jade @@ -43,7 +43,7 @@ script(type='text/ng-template', id='shareProjectModalTemplate') ng-click="removeMember(member)" ) i.fa.fa-times - .row.project-invite(ng-repeat="invite in state.invites") + .row.project-invite(ng-repeat="invite in project.invites") .col-xs-8 {{ invite.email }}  span.label.label-primary #{translate("pending")} .col-xs-3.text-left diff --git a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee index 4f3adbdcfd..dc7e8a630e 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee @@ -14,7 +14,6 @@ define [ } $modalInstance.opened.then () -> - getOutstandingInvites() $timeout () -> $scope.$broadcast "open" , 200 @@ -44,14 +43,6 @@ define [ getCurrentMemberEmails = () -> $scope.project.members.map (u) -> u.email - getOutstandingInvites = (callback) -> - projectInvites.getInvites().then( - (response) -> - $scope.state.invites = response?.data?.invites - , (response) -> - console.error response - ) - $scope.filterAutocompleteUsers = ($query) -> currentMemberEmails = getCurrentMemberEmails() return $scope.autocompleteContacts.filter (contact) -> @@ -95,7 +86,7 @@ define [ .success (data) -> if data.invite invite = data.invite - $scope.state.invites.push invite + $scope.project.invites.push invite else if data.users? users = data.users @@ -137,9 +128,9 @@ define [ .revokeInvite(invite._id) .success () -> $scope.state.inflight = false - index = $scope.state.invites.indexOf(invite) + index = $scope.project.invites.indexOf(invite) return if index == -1 - $scope.state.invites.splice(index, 1) + $scope.project.invites.splice(index, 1) .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 4bc69e814f..3f86b45cd4 100644 --- a/services/web/public/coffee/ide/share/services/projectMembers.coffee +++ b/services/web/public/coffee/ide/share/services/projectMembers.coffee @@ -11,13 +11,6 @@ define [ "X-Csrf-Token": window.csrfToken }) - addMember: (email, privileges) -> - $http.post("/project/#{ide.project_id}/users", { - email: email - privileges: privileges - _csrf: window.csrfToken - }) - addGroup: (group_id, privileges) -> $http.post("/project/#{ide.project_id}/group", { group_id: group_id diff --git a/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee b/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee index a98c34af28..3134cea34b 100644 --- a/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Editor/EditorHttpControllerTests.coffee @@ -17,7 +17,8 @@ describe "EditorHttpController", -> "./EditorController": @EditorController = {} '../../infrastructure/Metrics': @Metrics = {inc: sinon.stub()} "../Collaborators/CollaboratorsHandler": @CollaboratorsHandler = {} - + "../Collaborators/CollaboratorsInviteHandler": @CollaboratorsInviteHandler = {} + @project_id = "mock-project-id" @doc_id = "mock-doc-id" @user_id = "mock-user-id" @@ -102,9 +103,14 @@ describe "EditorHttpController", -> _id: @project_id owner:{_id:"something"} view: true + @invites = [ + {_id: "invite_one", email: "user-one@example.com", privileges: "readOnly", projectId: @project._id} + {_id: "invite_two", email: "user-two@example.com", privileges: "readOnly", projectId: @project._id} + ] @ProjectEditorHandler.buildProjectModelView = sinon.stub().returns(@projectModelView) @ProjectGetter.getProjectWithoutDocLines = sinon.stub().callsArgWith(1, null, @project) @CollaboratorsHandler.getMembersWithPrivilegeLevels = sinon.stub().callsArgWith(1, null, @members) + @CollaboratorsInviteHandler.getAllInvites = sinon.stub().callsArgWith(1, null, @invites) @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user) describe "when authorized", -> @@ -133,6 +139,11 @@ describe "EditorHttpController", -> .calledWith(@user_id, @project_id) .should.equal true + it 'should include the invites', -> + @CollaboratorsInviteHandler.getAllInvites + .calledWith(@project._id) + .should.equal true + it "should return the project model view, privilege level and protocol version", -> @callback.calledWith(null, @projectModelView, "owner").should.equal true diff --git a/services/web/test/UnitTests/coffee/Project/ProjectEditorHandlerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectEditorHandlerTests.coffee index eede50bfd3..671ae4a65b 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectEditorHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectEditorHandlerTests.coffee @@ -67,12 +67,16 @@ describe "ProjectEditorHandler", -> }, privilegeLevel: "readAndWrite" }] + @invites = [ + {_id: "invite_one", email: "user-one@example.com", privileges: "readOnly", projectId: @project._id} + {_id: "invite_two", email: "user-two@example.com", privileges: "readOnly", projectId: @project._id} + ] @handler = SandboxedModule.require modulePath describe "buildProjectModelView", -> describe "with owner and members included", -> beforeEach -> - @result = @handler.buildProjectModelView @project, @members + @result = @handler.buildProjectModelView @project, @members, @invites it "should include the id", -> should.exist @result._id @@ -144,6 +148,10 @@ describe "ProjectEditorHandler", -> @result.rootFolder[0].folders[0].docs[0].name.should.equal "main.tex" should.not.exist @result.rootFolder[0].folders[0].docs[0].lines + it 'should include invites', -> + should.exist @result.invites + @result.invites.should.deep.equal @invites + describe "deletedByExternalDataSource", -> it "should set the deletedByExternalDataSource flag to false when it is not there", ->