diff --git a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee index fc4b5c452b..f7dd9f3e17 100644 --- a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee +++ b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee @@ -204,11 +204,11 @@ module.exports = DocumentUpdaterHandler = logger.error {project_id, doc_id, thread_id}, "doc updater returned a non-success status code: #{res.statusCode}" callback new Error("doc updater returned a non-success status code: #{res.statusCode}") - updateProjectStructure : (project_id, userId, oldDocs, newDocs, oldFiles, newFiles, callback = (error) ->)-> + updateProjectStructure : (project_id, userId, changes, callback = (error) ->)-> return callback() if !settings.apis.project_history?.enabled - docUpdates = DocumentUpdaterHandler._getRenameUpdates('doc', oldDocs, newDocs) - fileUpdates = DocumentUpdaterHandler._getRenameUpdates('file', oldFiles, newFiles) + docUpdates = DocumentUpdaterHandler._getRenameUpdates('doc', changes.oldDocs, changes.newDocs) + fileUpdates = DocumentUpdaterHandler._getRenameUpdates('file', changes.oldFiles, changes.newFiles) timer = new metrics.Timer("set-document") url = "#{settings.apis.documentupdater.url}/project/#{project_id}" @@ -231,6 +231,8 @@ module.exports = DocumentUpdaterHandler = callback new Error("doc updater returned a non-success status code: #{res.statusCode}") _getRenameUpdates: (entityType, oldEntities, newEntities) -> + oldEntities ||= [] + newEntities ||= [] updates = [] oldEntitiesHash = _.indexBy oldEntities, (entity) -> entity[entityType]._id.toString() diff --git a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee index 9549417403..446786fa57 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee @@ -176,11 +176,12 @@ module.exports = ProjectEntityHandler = rev: 0 }, (err) -> return callback(err) if err? - newDoc = + newDocs = [ doc: doc path: result?.path?.fileSystem docLines: docLines.join('\n') - DocumentUpdaterHandler.updateProjectStructure project_id, userId, [], [newDoc], [], [], (error) -> + ] + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {newDocs}, (error) -> return callback(error) if error? callback null, doc, folder_id @@ -214,11 +215,12 @@ module.exports = ProjectEntityHandler = return callback(err) tpdsUpdateSender.addFile {project_id:project._id, file_id:fileRef._id, path:result?.path?.fileSystem, project_name:project.name, rev:fileRef.rev}, (err) -> return callback(err) if err? - newFile = + newFiles = [ file: fileRef path: result?.path?.fileSystem url: fileStoreUrl - DocumentUpdaterHandler.updateProjectStructure project_id, userId, [], [], [], [newFile], (error) -> + ] + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {newFiles}, (error) -> return callback(error) if error? callback null, fileRef, folder_id @@ -247,11 +249,12 @@ module.exports = ProjectEntityHandler = "$set": set Project.findOneAndUpdate conditions, update, { "new": true}, (err) -> return callback(err) if err? - newFile = + newFiles = [ file: fileRef path: path.fileSystem url: fileStoreUrl - DocumentUpdaterHandler.updateProjectStructure project_id, userId, [], [], [], [newFile], callback + ] + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {newFiles}, callback copyFileFromExistingProjectWithProject: (project, folder_id, originalProject_id, origonalFileRef, userId, callback = (error, fileRef, folder_id) ->)-> project_id = project._id @@ -273,11 +276,12 @@ module.exports = ProjectEntityHandler = tpdsUpdateSender.addFile { project_id, file_id:fileRef._id, path:result?.path?.fileSystem, rev:fileRef.rev, project_name:project.name}, (err) -> if err? logger.err { err, project_id, folder_id, originalProject_id, origonalFileRef }, "error sending file to tpds worker" - newFile = + newFiles = [ file: fileRef path: result?.path?.fileSystem url: fileStoreUrl - DocumentUpdaterHandler.updateProjectStructure project_id, userId, [], [], [], [newFile], (error) -> + ] + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {newFiles}, (error) -> return callback(error) if error? callback null, fileRef, folder_id @@ -393,7 +397,7 @@ module.exports = ProjectEntityHandler = tpdsUpdateSender.moveEntity opts self.getAllEntitiesFromProject newProject, (error, newDocs, newFiles) => return callback(error) if error? - DocumentUpdaterHandler.updateProjectStructure project_id, userId, oldDocs, newDocs, oldFiles, newFiles, callback + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {oldDocs, newDocs, oldFiles, newFiles}, callback _checkValidMove: (project, entityType, entityPath, destFolderId, callback = (error) ->) -> return callback() if !entityType.match(/folder/) @@ -450,7 +454,7 @@ module.exports = ProjectEntityHandler = return callback(error) if error? ProjectEntityHandler.getAllEntitiesFromProject newProject, (error, newDocs, newFiles) => return callback(error) if error? - DocumentUpdaterHandler.updateProjectStructure project_id, userId, oldDocs, newDocs, oldFiles, newFiles, callback + DocumentUpdaterHandler.updateProjectStructure project_id, userId, {oldDocs, newDocs, oldFiles, newFiles}, callback _cleanUpEntity: (project, entity, entityType, callback = (error) ->) -> if(entityType.indexOf("file") != -1) diff --git a/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee b/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee index 99214749d6..14ccaa3a33 100644 --- a/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee +++ b/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee @@ -396,7 +396,7 @@ describe 'DocumentUpdaterHandler', -> @settings.apis.project_history.enabled = false @request.post = sinon.stub() - @handler.updateProjectStructure @project_id, @user_id, @oldDocs, @newDocs, @oldFiles, @newFiles, @callback + @handler.updateProjectStructure @project_id, @user_id, {}, @callback it 'does not make a web request', -> @request.post.called.should.equal false @@ -414,17 +414,17 @@ describe 'DocumentUpdaterHandler', -> it 'should send the structure update to the document updater', (done) -> @docIdA = new ObjectId() @docIdB = new ObjectId() - @oldDocs = [ - { path: '/old_a', doc: _id: @docIdA } - { path: '/old_b', doc: _id: @docIdB } - ] - # create new instances of the same ObjectIds so that == doens't pass - @newDocs = [ - { path: '/old_a', doc: _id: new ObjectId(@docIdA.toString()) } - { path: '/new_b', doc: _id: new ObjectId(@docIdB.toString()) } - ] - @oldFiles = [] - @newFiles = [] + @changes = { + oldDocs: [ + { path: '/old_a', doc: _id: @docIdA } + { path: '/old_b', doc: _id: @docIdB } + ] + # create new instances of the same ObjectIds so that == doesn't pass + newDocs: [ + { path: '/old_a', doc: _id: new ObjectId(@docIdA.toString()) } + { path: '/new_b', doc: _id: new ObjectId(@docIdB.toString()) } + ] + } docUpdates = [ id: @docIdB.toString(), @@ -432,7 +432,7 @@ describe 'DocumentUpdaterHandler', -> newPathname: "/new_b" ] - @handler.updateProjectStructure @project_id, @user_id, @oldDocs, @newDocs, @oldFiles, @newFiles, () => + @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id}) .should.equal true @@ -441,12 +441,9 @@ describe 'DocumentUpdaterHandler', -> describe "when a doc has been added", -> it 'should send the structure update to the document updater', (done) -> @docId = new ObjectId() - @oldDocs = [] - @newDocs = [ + @changes = newDocs: [ { path: '/foo', docLines: 'a\nb', doc: _id: @docId } ] - @oldFiles = [] - @newFiles = [] docUpdates = [ id: @docId.toString(), @@ -455,7 +452,7 @@ describe 'DocumentUpdaterHandler', -> url: undefined ] - @handler.updateProjectStructure @project_id, @user_id, @oldDocs, @newDocs, @oldFiles, @newFiles, () => + @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id}) .should.equal true @@ -464,10 +461,7 @@ describe 'DocumentUpdaterHandler', -> describe "when a file has been added", -> it 'should send the structure update to the document updater', (done) -> @fileId = new ObjectId() - @oldDocs = [] - @newDocs = [] - @oldFiles = [] - @newFiles = [ + @changes = newFiles: [ { path: '/bar', url: 'filestore.example.com/file', file: _id: @fileId } ] @@ -478,7 +472,7 @@ describe 'DocumentUpdaterHandler', -> docLines: undefined ] - @handler.updateProjectStructure @project_id, @user_id, @oldDocs, @newDocs, @oldFiles, @newFiles, () => + @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post .calledWith(url: @url, json: {docUpdates: [], fileUpdates, userId: @user_id}) .should.equal true @@ -487,14 +481,11 @@ describe 'DocumentUpdaterHandler', -> describe "when a doc has been deleted", -> it 'should do nothing', (done) -> @docId = new ObjectId() - @oldDocs = [ + @changes = oldDocs: [ { path: '/foo', docLines: 'a\nb', doc: _id: @docId } ] - @newDocs = [] - @oldFiles = [] - @newFiles = [] - @handler.updateProjectStructure @project_id, @user_id, @oldDocs, @newDocs, @oldFiles, @newFiles, () => + @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post.called.should.equal false done() diff --git a/services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee index 18e44f46a6..f62690e226 100644 --- a/services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee @@ -69,7 +69,7 @@ describe 'ProjectEntityHandler', -> @settings = maxEntitiesPerProject:200 @documentUpdaterHandler = - updateProjectStructure: sinon.stub().callsArg(6) + updateProjectStructure: sinon.stub().yields() deleteDoc: sinon.stub().callsArg(2) @ProjectEntityHandler = SandboxedModule.require modulePath, requires: '../../models/Project': Project:@ProjectModel @@ -274,7 +274,7 @@ describe 'ProjectEntityHandler', -> it "should should send the update to the doc updater", -> @documentUpdaterHandler.updateProjectStructure - .calledWith(project_id, userId, @oldDocs, @newDocs, @oldFiles, @newFiles) + .calledWith(project_id, userId, {@oldDocs, @newDocs, @oldFiles, @newFiles}) .should.equal true it 'should remove the element from its current position', -> @@ -326,7 +326,7 @@ describe 'ProjectEntityHandler', -> it "should should send the update to the doc updater", -> @documentUpdaterHandler.updateProjectStructure - .calledWith(project_id, userId, @oldDocs, @newDocs, @oldFiles, @newFiles) + .calledWith(project_id, userId, {@oldDocs, @newDocs, @oldFiles, @newFiles}) .should.equal true it 'should remove the element from its current position', -> @@ -487,12 +487,13 @@ describe 'ProjectEntityHandler', -> .should.equal true it "should should send the change in project structure to the doc updater", () -> - newDoc = + newDocs = [ doc: @doc path: @path docLines: @lines.join('\n') + ] @documentUpdaterHandler.updateProjectStructure - .calledWith(project_id, userId, [], [newDoc], [], []) + .calledWith(project_id, userId, {newDocs}) .should.equal true describe "restoreDoc", -> @@ -570,9 +571,10 @@ describe 'ProjectEntityHandler', -> @ProjectEntityHandler.addFile project_id, folder_id, fileName, {}, userId, (err, fileRef, parentFolder)-> it "should should send the change in project structure to the doc updater", (done) -> - @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, oldDocs, newDocs, oldFiles, newFiles) => + @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, changes) => passed_project_id.should.equal project_id passed_user_id.should.equal userId + { newFiles } = changes newFiles.length.should.equal 1 newFile = newFiles[0] newFile.file.name.should.equal fileName @@ -635,9 +637,10 @@ describe 'ProjectEntityHandler', -> @ProjectEntityHandler.replaceFile project_id, @file_id, @fsPath, userId, => it "should should send the old and new project structure to the doc updater", (done) -> - @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, oldDocs, newDocs, oldFiles, newFiles) => + @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, changes) => passed_project_id.should.equal project_id passed_user_id.should.equal userId + { newFiles } = changes newFiles.length.should.equal 1 newFile = newFiles[0] newFile.file.name.should.equal @fileName @@ -1029,9 +1032,10 @@ describe 'ProjectEntityHandler', -> @ProjectEntityHandler.copyFileFromExistingProjectWithProject @project, folder_id, oldProject_id, oldFileRef, userId, (err, fileRef, parentFolder)-> it "should should send the change in project structure to the doc updater", (done) -> - @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, oldDocs, newDocs, oldFiles, newFiles) => + @documentUpdaterHandler.updateProjectStructure = (passed_project_id, passed_user_id, changes) => passed_project_id.should.equal project_id passed_user_id.should.equal userId + { newFiles } = changes newFiles.length.should.equal 1 newFile = newFiles[0] newFile.file.name.should.equal fileName @@ -1060,12 +1064,12 @@ describe 'ProjectEntityHandler', -> @projectLocator.findElement = sinon.stub().callsArgWith(1, null, @entity = { _id: @entity_id, name:"old.tex", rev:4 }, @path) @tpdsUpdateSender.moveEntity = sinon.stub() @ProjectModel.findOneAndUpdate = sinon.stub().callsArgWith(3, null, @project) - @documentUpdaterHandler.updateProjectStructure = sinon.stub().callsArg(6) + @documentUpdaterHandler.updateProjectStructure = sinon.stub().yields() it "should should send the old and new project structure to the doc updater", (done) -> @ProjectEntityHandler.renameEntity project_id, @entity_id, @entityType, @newName, userId, => @documentUpdaterHandler.updateProjectStructure - .calledWith(project_id, userId, @oldDocs, @newDocs, @oldFiles, @newFiles) + .calledWith(project_id, userId, {@oldDocs, @newDocs, @oldFiles, @newFiles}) .should.equal true done()