Merge pull request #1643 from sharelatex/spd-transfer-projects

Add support for transferring project ownership

GitOrigin-RevId: 088e02bb5be67033dba8e24c11660a1e200a3258
This commit is contained in:
Simon Detheridge 2019-03-22 12:14:49 +00:00 committed by sharelatex
parent a5ad2e48d4
commit d184087a53
2 changed files with 52 additions and 0 deletions

View file

@ -8,6 +8,7 @@ _ = require("underscore")
PublicAccessLevels = require("../Authorization/PublicAccessLevels")
Errors = require("../Errors/Errors")
ProjectTokenGenerator = require('./ProjectTokenGenerator')
ProjectEntityHandler = require('./ProjectEntityHandler')
ProjectHelper = require('./ProjectHelper')
settings = require('settings-sharelatex')
@ -46,6 +47,26 @@ module.exports = ProjectDetailsHandler =
logger.err err:err, "something went wrong setting project description"
callback(err)
transferOwnership: (project_id, user_id, callback)->
ProjectGetter.getProject project_id, {owner_ref: true}, (err, project)->
return callback(err) if err?
return callback(new Errors.NotFoundError("project not found")) unless project?
return callback() if project.owner_ref == user_id
UserGetter.getUser user_id, (err, user) ->
return callback(err) if err?
return callback(new Errors.NotFoundError("user not found")) unless user?
Project.update {_id: project_id},
{$set: {owner_ref: user_id}, $pull: {
readOnly_refs: user_id,
collaberator_refs: user_id,
tokenAccessReadAndWrite_refs: user_id,
tokenAccessReadOnly_refs: user_id
}}, (err) ->
return callback(err) if err?
ProjectEntityHandler.flushProjectToThirdPartyDataStore project_id, callback
renameProject: (project_id, newName, callback = ->)->
ProjectDetailsHandler.validateProjectName newName, (error) ->
return callback(error) if error?

View file

@ -30,11 +30,14 @@ describe 'ProjectDetailsHandler', ->
getUser: sinon.stub().callsArgWith(1, null, @user)
@tpdsUpdateSender =
moveEntity:sinon.stub().callsArgWith 1
@ProjectEntityHandler =
flushProjectToThirdPartyDataStore: sinon.stub().callsArg(1)
@handler = SandboxedModule.require modulePath, requires:
"./ProjectGetter":@ProjectGetter
'../../models/Project': Project:@ProjectModel
"../User/UserGetter": @UserGetter
'../ThirdPartyDataStore/TpdsUpdateSender':@tpdsUpdateSender
"./ProjectEntityHandler": @ProjectEntityHandler
'logger-sharelatex':
log:->
err:->
@ -80,6 +83,34 @@ describe 'ProjectDetailsHandler', ->
err.should.equal error
done()
describe "transferOwnership", ->
it "should return a not found error if the project can't be found", (done) ->
@ProjectGetter.getProject.callsArgWith(2)
@handler.transferOwnership 'abc', '123', (err) ->
err.should.exist
err.name.should.equal "NotFoundError"
done()
it "should return a not found error if the user can't be found", (done) ->
@ProjectGetter.getProject.callsArgWith(2)
@handler.transferOwnership 'abc', '123', (err) ->
err.should.exist
err.name.should.equal "NotFoundError"
done()
it "should transfer ownership of the project", (done) ->
@ProjectModel.update.callsArgWith(2)
@handler.transferOwnership 'abc', '123', () =>
sinon.assert.calledWith(@ProjectModel.update, {_id: 'abc'})
done()
it "should flush the project to tpds", (done) ->
@ProjectModel.update.callsArgWith(2)
@handler.transferOwnership 'abc', '123', () =>
sinon.assert.calledWith(@ProjectEntityHandler.flushProjectToThirdPartyDataStore, 'abc')
done()
describe "getProjectDescription", ->
it "should make a call to mongo just for the description", (done)->