diff --git a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee index ba565af867..4f3b93fc48 100644 --- a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee @@ -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? diff --git a/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee index 9714a7e6bd..22dc15826e 100644 --- a/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee @@ -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)->