From eda09b7dfc1d9340978abed4033f16e9bfc2833b Mon Sep 17 00:00:00 2001 From: Eric Mc Sween Date: Mon, 9 Jan 2023 07:54:36 -0500 Subject: [PATCH] Merge pull request #10971 from overleaf/em-flush-docupdater-on-rename Flush project in docupdater after a rename GitOrigin-RevId: f08e722e9eb65e281965fe2603f8e97024edb8e9 --- .../Project/ProjectEntityUpdateHandler.js | 162 ++++++++++-------- .../ProjectEntityUpdateHandlerTests.js | 22 +-- 2 files changed, 100 insertions(+), 84 deletions(-) diff --git a/services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js b/services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js index f6350005a4..7f046880b5 100644 --- a/services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js +++ b/services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js @@ -1246,44 +1246,51 @@ const ProjectEntityUpdateHandler = { return callback(new Error('No entityType set')) } entityType = entityType.toLowerCase() - ProjectEntityMongoUpdateHandler.moveEntity( - projectId, - entityId, - destFolderId, - entityType, - (err, project, startPath, endPath, rev, changes) => { - if (err != null) { - return callback(err) - } - const projectHistoryId = - project.overleaf && - project.overleaf.history && - project.overleaf.history.id - // do not wait - TpdsUpdateSender.promises - .moveEntity({ - projectId, - projectName: project.name, - startPath, - endPath, - rev, - entityId, - entityType, - folderId: destFolderId, - }) - .catch(err => { - logger.error({ err }, 'error sending tpds update') - }) - DocumentUpdaterHandler.updateProjectStructure( - projectId, - projectHistoryId, - userId, - changes, - source, - callback - ) + DocumentUpdaterHandler.flushProjectToMongo(projectId, err => { + if (err) { + return callback(err) } - ) + ProjectEntityMongoUpdateHandler.moveEntity( + projectId, + entityId, + destFolderId, + entityType, + (err, project, startPath, endPath, rev, changes) => { + if (err != null) { + return callback(err) + } + const projectHistoryId = + project.overleaf && + project.overleaf.history && + project.overleaf.history.id + TpdsUpdateSender.moveEntity( + { + projectId, + projectName: project.name, + startPath, + endPath, + rev, + entityId, + entityType, + folderId: destFolderId, + }, + err => { + if (err) { + logger.error({ err }, 'error sending tpds update') + } + DocumentUpdaterHandler.updateProjectStructure( + projectId, + projectHistoryId, + userId, + changes, + source, + callback + ) + } + ) + } + ) + }) }), renameEntity: wrapWithLock(function ( @@ -1305,44 +1312,51 @@ const ProjectEntityUpdateHandler = { } entityType = entityType.toLowerCase() - ProjectEntityMongoUpdateHandler.renameEntity( - projectId, - entityId, - entityType, - newName, - (err, project, startPath, endPath, rev, changes) => { - if (err != null) { - return callback(err) - } - const projectHistoryId = - project.overleaf && - project.overleaf.history && - project.overleaf.history.id - // do not wait - TpdsUpdateSender.promises - .moveEntity({ - projectId, - projectName: project.name, - startPath, - endPath, - rev, - entityId, - entityType, - folderId: null, // this means the folder has not changed - }) - .catch(err => { - logger.error({ err }, 'error sending tpds update') - }) - DocumentUpdaterHandler.updateProjectStructure( - projectId, - projectHistoryId, - userId, - changes, - source, - callback - ) + DocumentUpdaterHandler.flushProjectToMongo(projectId, err => { + if (err) { + return callback(err) } - ) + ProjectEntityMongoUpdateHandler.renameEntity( + projectId, + entityId, + entityType, + newName, + (err, project, startPath, endPath, rev, changes) => { + if (err != null) { + return callback(err) + } + const projectHistoryId = + project.overleaf && + project.overleaf.history && + project.overleaf.history.id + TpdsUpdateSender.moveEntity( + { + projectId, + projectName: project.name, + startPath, + endPath, + rev, + entityId, + entityType, + folderId: null, // this means the folder has not changed + }, + err => { + if (err) { + logger.error({ err }, 'error sending tpds update') + } + DocumentUpdaterHandler.updateProjectStructure( + projectId, + projectHistoryId, + userId, + changes, + source, + callback + ) + } + ) + } + ) + }) }), // This doesn't directly update project structure but we need to take the lock diff --git a/services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js b/services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js index 52bbfb3a43..cf719c60c3 100644 --- a/services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js +++ b/services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js @@ -76,6 +76,7 @@ describe('ProjectEntityUpdateHandler', function () { } this.DocumentUpdaterHandler = { flushDocToMongo: sinon.stub().yields(), + flushProjectToMongo: sinon.stub().yields(), updateProjectStructure: sinon.stub().yields(), setDocument: sinon.stub(), resyncProjectHistory: sinon.stub().yields(), @@ -128,10 +129,7 @@ describe('ProjectEntityUpdateHandler', function () { addFile: sinon.stub().yields(), addDoc: sinon.stub(), deleteEntity: sinon.stub().yields(), - moveEntity: sinon.stub(), - promises: { - moveEntity: sinon.stub().resolves(), - }, + moveEntity: sinon.stub().yields(), } this.FileStoreHandler = { copyFile: sinon.stub(), @@ -1786,7 +1784,7 @@ describe('ProjectEntityUpdateHandler', function () { }) it('notifies tpds', function () { - this.TpdsUpdateSender.promises.moveEntity + this.TpdsUpdateSender.moveEntity .calledWith({ projectId, projectName: this.project_name, @@ -1807,8 +1805,7 @@ describe('ProjectEntityUpdateHandler', function () { projectHistoryId, userId, this.changes, - this.source, - this.callback + this.source ) .should.equal(true) }) @@ -1850,7 +1847,7 @@ describe('ProjectEntityUpdateHandler', function () { }) it('notifies tpds', function () { - this.TpdsUpdateSender.promises.moveEntity + this.TpdsUpdateSender.moveEntity .calledWith({ projectId, projectName: this.project_name, @@ -1864,6 +1861,12 @@ describe('ProjectEntityUpdateHandler', function () { .should.equal(true) }) + it('flushes the project in doc updater', function () { + this.DocumentUpdaterHandler.flushProjectToMongo.should.have.been.calledWith( + projectId + ) + }) + it('sends the changes in project structure to the doc updater', function () { this.DocumentUpdaterHandler.updateProjectStructure .calledWith( @@ -1871,8 +1874,7 @@ describe('ProjectEntityUpdateHandler', function () { projectHistoryId, userId, this.changes, - this.source, - this.callback + this.source ) .should.equal(true) })