From 0642e3c8c9df79d3247f77b2555c5aff87e751c5 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 5 Mar 2018 12:14:47 +0000 Subject: [PATCH] support project version on incoming requests --- .../app/coffee/HttpController.coffee | 6 +++--- .../coffee/ProjectHistoryRedisManager.coffee | 2 ++ .../app/coffee/ProjectManager.coffee | 7 ++++++- .../HttpController/HttpControllerTests.coffee | 9 +++++---- .../ProjectManager/updateProjectTests.coffee | 17 +++++++++-------- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/services/document-updater/app/coffee/HttpController.coffee b/services/document-updater/app/coffee/HttpController.coffee index 9918339d6e..ce4d8bf637 100644 --- a/services/document-updater/app/coffee/HttpController.coffee +++ b/services/document-updater/app/coffee/HttpController.coffee @@ -161,10 +161,10 @@ module.exports = HttpController = updateProject: (req, res, next = (error) ->) -> timer = new Metrics.Timer("http.updateProject") project_id = req.params.project_id - {userId, docUpdates, fileUpdates} = req.body - logger.log {project_id, docUpdates, fileUpdates}, "updating project via http" + {userId, docUpdates, fileUpdates, version} = req.body + logger.log {project_id, docUpdates, fileUpdates, version}, "updating project via http" - ProjectManager.updateProjectWithLocks project_id, userId, docUpdates, fileUpdates, (error) -> + ProjectManager.updateProjectWithLocks project_id, userId, docUpdates, fileUpdates, version, (error) -> timer.done() return next(error) if error? logger.log project_id: project_id, "updated project via http" diff --git a/services/document-updater/app/coffee/ProjectHistoryRedisManager.coffee b/services/document-updater/app/coffee/ProjectHistoryRedisManager.coffee index 6de1d8efc9..ebf5568317 100644 --- a/services/document-updater/app/coffee/ProjectHistoryRedisManager.coffee +++ b/services/document-updater/app/coffee/ProjectHistoryRedisManager.coffee @@ -14,6 +14,7 @@ module.exports = ProjectHistoryRedisManager = meta: user_id: user_id ts: new Date() + version: update.version update[entity_type] = entity_id logger.log {project_id, update}, "queue rename operation to project-history" @@ -29,6 +30,7 @@ module.exports = ProjectHistoryRedisManager = meta: user_id: user_id ts: new Date() + version: update.version update[entity_type] = entitiy_id logger.log {project_id, update}, "queue add operation to project-history" diff --git a/services/document-updater/app/coffee/ProjectManager.coffee b/services/document-updater/app/coffee/ProjectManager.coffee index 36ae86363d..729f1743e8 100644 --- a/services/document-updater/app/coffee/ProjectManager.coffee +++ b/services/document-updater/app/coffee/ProjectManager.coffee @@ -105,16 +105,20 @@ module.exports = ProjectManager = clearProjectState: (project_id, callback = (error) ->) -> RedisManager.clearProjectState project_id, callback - updateProjectWithLocks: (project_id, user_id, docUpdates, fileUpdates, _callback = (error) ->) -> + updateProjectWithLocks: (project_id, user_id, docUpdates, fileUpdates, version, _callback = (error) ->) -> timer = new Metrics.Timer("projectManager.updateProject") callback = (args...) -> timer.done() _callback(args...) + project_version = version + project_subversion = 0 # project versions can have multiple operations + project_ops_length = 0 handleDocUpdate = (update, cb) -> doc_id = update.id + update.version = "#{project_version}.#{project_subversion++}" if update.docLines? ProjectHistoryRedisManager.queueAddEntity project_id, 'doc', doc_id, user_id, update, (error, count) -> project_ops_length = count @@ -126,6 +130,7 @@ module.exports = ProjectManager = handleFileUpdate = (update, cb) -> file_id = update.id + update.version = "#{project_version}.#{project_subversion++}" if update.url? ProjectHistoryRedisManager.queueAddEntity project_id, 'file', file_id, user_id, update, (error, count) -> project_ops_length = count diff --git a/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee b/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee index b79659cada..fca1614c2d 100644 --- a/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee +++ b/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee @@ -512,19 +512,20 @@ describe "HttpController", -> @userId = "user-id-123" @docUpdates = sinon.stub() @fileUpdates = sinon.stub() + @version = 1234567 @req = - body: {@userId, @docUpdates, @fileUpdates} + body: {@userId, @docUpdates, @fileUpdates, @version} params: project_id: @project_id describe "successfully", -> beforeEach -> - @ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(4) + @ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(5) @HttpController.updateProject(@req, @res, @next) it "should accept the change", -> @ProjectManager.updateProjectWithLocks - .calledWith(@project_id, @userId, @docUpdates, @fileUpdates) + .calledWith(@project_id, @userId, @docUpdates, @fileUpdates, @version) .should.equal true it "should return a successful No Content response", -> @@ -537,7 +538,7 @@ describe "HttpController", -> describe "when an errors occurs", -> beforeEach -> - @ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(4, new Error("oops")) + @ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(5, new Error("oops")) @HttpController.updateProject(@req, @res, @next) it "should call next with the error", -> diff --git a/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee b/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee index 7bd5c19848..b04a8c7a50 100644 --- a/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee +++ b/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee @@ -18,6 +18,7 @@ describe "ProjectManager", -> @project_id = "project-id-123" @user_id = "user-id-123" + @version = 1234567 @HistoryManager.shouldFlushHistoryOps = sinon.stub().returns(false) @HistoryManager.flushProjectChangesAsync = sinon.stub() @callback = sinon.stub() @@ -45,7 +46,7 @@ describe "ProjectManager", -> describe "successfully", -> beforeEach -> - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should rename the docs in the updates", -> @DocumentManager.renameDocWithLock @@ -72,7 +73,7 @@ describe "ProjectManager", -> beforeEach -> @error = new Error('error') @DocumentManager.renameDocWithLock = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should call the callback with the error", -> @callback.calledWith(@error).should.equal true @@ -81,7 +82,7 @@ describe "ProjectManager", -> beforeEach -> @error = new Error('error') @ProjectHistoryRedisManager.queueRenameEntity = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should call the callback with the error", -> @callback.calledWith(@error).should.equal true @@ -89,7 +90,7 @@ describe "ProjectManager", -> describe "with enough ops to flush", -> beforeEach -> @HistoryManager.shouldFlushHistoryOps = sinon.stub().returns(true) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should flush the history", -> @HistoryManager.flushProjectChangesAsync @@ -113,7 +114,7 @@ describe "ProjectManager", -> describe "successfully", -> beforeEach -> - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should add the docs in the updates", -> @ProjectHistoryRedisManager.queueAddEntity @@ -140,7 +141,7 @@ describe "ProjectManager", -> beforeEach -> @error = new Error('error') @ProjectHistoryRedisManager.queueAddEntity = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should call the callback with the error", -> @callback.calledWith(@error).should.equal true @@ -149,7 +150,7 @@ describe "ProjectManager", -> beforeEach -> @error = new Error('error') @ProjectHistoryRedisManager.queueAddEntity = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should call the callback with the error", -> @callback.calledWith(@error).should.equal true @@ -157,7 +158,7 @@ describe "ProjectManager", -> describe "with enough ops to flush", -> beforeEach -> @HistoryManager.shouldFlushHistoryOps = sinon.stub().returns(true) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @version, @callback it "should flush the history", -> @HistoryManager.flushProjectChangesAsync