mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-15 04:14:47 +00:00
Load invites on project load, rather than asynchronously.
This commit is contained in:
parent
a6b8bf6ece
commit
dca1c9be5d
9 changed files with 40 additions and 35 deletions
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 :("
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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", ->
|
||||
|
|
Loading…
Reference in a new issue