Load invites on project load, rather than asynchronously.

This commit is contained in:
Shane Kilkelly 2016-08-01 17:05:37 +01:00
parent a6b8bf6ece
commit dca1c9be5d
9 changed files with 40 additions and 35 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 :("

View file

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

View file

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

View file

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