From 73fed8b0bfedd7af66b6a0d5efb384cb8e8c166f Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Mon, 25 Jul 2016 11:17:47 +0100 Subject: [PATCH] Add a `getAllInvites` api endpoint --- .../CollaboratorsInviteController.coffee | 9 ++++ .../CollaboratorsInviteHandler.coffee | 8 ++++ .../Collaborators/CollaboratorsRouter.coffee | 6 +++ .../CollaboratorsInviteControllerTests.coffee | 42 ++++++++++++++++++ .../CollaboratorsInviteHandlerTests.coffee | 44 +++++++++++++++++++ 5 files changed, 109 insertions(+) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee index c3c73a2165..ef23263805 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee @@ -7,6 +7,15 @@ logger = require('logger-sharelatex') module.exports = CollaboratorsInviteController = + getAllInvites: (req, res, next) -> + projectId = req.params.Project_id + logger.log {projectId}, "getting all active invites for project" + CollaboratorsInviteHandler.getAllInvites projectId, (err, invites) -> + if err? + logger.err {projectId}, "error getting invites for project" + return next(err) + res.json({invites: invites}) + inviteToProject: (req, res, next) -> projectId = req.params.Project_id email = req.body.email diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index 597fe8c082..3ba77019b7 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -11,6 +11,14 @@ Crypto = require 'crypto' module.exports = CollaboratorsInviteHandler = + getAllInvites: (projectId, callback=(err, invites)->) -> + logger.log {projectId}, "fetching invites from mongo" + ProjectInvite.find {projectId: projectId}, (err, invites) -> + if err? + logger.err {err, projectId}, "error getting invites from mongo" + return callback(err) + callback(null, invites) + inviteToProject: (projectId, sendingUserId, email, privileges, callback=(err,invite)->) -> logger.log {projectId, sendingUserId, email, privileges}, "adding invite" Crypto.randomBytes 24, (err, buffer) -> diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsRouter.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsRouter.coffee index 9412f794ba..f67bb3ee6c 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsRouter.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsRouter.coffee @@ -17,6 +17,12 @@ module.exports = CollaboratorsInviteController.inviteToProject ) + webRouter.get( + '/project/:Project_id/invite', + AuthorizationMiddlewear.ensureUserCanAdminProject, + CollaboratorsInviteController.getAllInvites + ) + webRouter.delete( '/project/:Project_id/invite/:invite_id', AuthorizationMiddlewear.ensureUserCanAdminProject, diff --git a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee index 6e1cb4f11a..08fcd2d54c 100644 --- a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee @@ -25,6 +25,48 @@ describe "CollaboratorsInviteController", -> @project_id = "project-id-123" @callback = sinon.stub() + + describe 'getAllInvites', -> + + beforeEach -> + @fakeInvites = [ + {_id: ObjectId(), one: 1}, + {_id: ObjectId(), two: 2} + ] + @req.params = + Project_id: @project_id + @res.json = sinon.stub() + @next = sinon.stub() + + describe 'when all goes well', -> + + beforeEach -> + @CollaboratorsInviteHandler.getAllInvites = sinon.stub().callsArgWith(1, null, @fakeInvites) + @CollaboratorsInviteController.getAllInvites @req, @res, @next + + it 'should not produce an error', -> + @next.callCount.should.equal 0 + + it 'should produce a list of invite objects', -> + @res.json.callCount.should.equal 1 + @res.json.calledWith({invites: @fakeInvites}).should.equal true + + it 'should have called CollaboratorsInviteHandler.getAllInvites', -> + @CollaboratorsInviteHandler.getAllInvites.callCount.should.equal 1 + @CollaboratorsInviteHandler.getAllInvites.calledWith(@project_id).should.equal true + + describe 'when CollaboratorsInviteHandler.getAllInvites produces an error', -> + + beforeEach -> + @CollaboratorsInviteHandler.getAllInvites = sinon.stub().callsArgWith(1, new Error('woops')) + @CollaboratorsInviteController.getAllInvites @req, @res, @next + + it 'should produce an error', -> + @next.callCount.should.equal 1 + @next.firstCall.args[0].should.be.instanceof Error + + # # # # + describe 'inviteToProject', -> beforeEach -> diff --git a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee index b4adff9a33..1af35edc90 100644 --- a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee @@ -18,6 +18,7 @@ describe "CollaboratorsInviteHandler", -> this save: sinon.stub() @findOne: sinon.stub() + @find: sinon.stub() @remove: sinon.stub() @Project = class Project constructor: () -> @@ -54,6 +55,49 @@ describe "CollaboratorsInviteHandler", -> privileges: @privileges createdAt: new Date() + describe 'getAllInvites', -> + + beforeEach -> + @fakeInvites = [ + {_id: ObjectId(), one: 1}, + {_id: ObjectId(), two: 2} + ] + @ProjectInvite.find.callsArgWith(1, null, @fakeInvites) + @call = (callback) => + @CollaboratorsInviteHandler.getAllInvites @projectId, callback + + describe 'when all goes well', -> + + beforeEach -> + + it 'should not produce an error', (done) -> + @call (err, invites) => + expect(err).to.not.be.instanceof Error + expect(err).to.be.oneOf [null, undefined] + done() + + it 'should produce a list of invite objects', (done) -> + @call (err, invites) => + expect(invites).to.not.be.oneOf [null, undefined] + expect(invites).to.deep.equal @fakeInvites + done() + + it 'should have called ProjectInvite.find', (done) -> + @call (err, invites) => + @ProjectInvite.find.callCount.should.equal 1 + @ProjectInvite.find.calledWith({projectId: @projectId}).should.equal true + done() + + describe 'when ProjectInvite.find produces an error', -> + + beforeEach -> + @ProjectInvite.find.callsArgWith(1, new Error('woops')) + + it 'should produce an error', (done) -> + @call (err, invites) => + expect(err).to.be.instanceof Error + done() + describe 'inviteToProject', -> beforeEach ->