From a3420b12369273a4b76f3ec5f3ddbb970b309418 Mon Sep 17 00:00:00 2001 From: Hayden Faulds Date: Fri, 10 Nov 2017 14:54:56 +0000 Subject: [PATCH] version entity additions --- .../app/coffee/ProjectManager.coffee | 10 +- .../app/coffee/RedisManager.coffee | 15 ++ .../ProjectManager/updateProjectTests.coffee | 144 ++++++++++++------ .../RedisManager/RedisManagerTests.coffee | 27 ++++ 4 files changed, 151 insertions(+), 45 deletions(-) diff --git a/services/document-updater/app/coffee/ProjectManager.coffee b/services/document-updater/app/coffee/ProjectManager.coffee index 2f85173b4c..fe7867319d 100644 --- a/services/document-updater/app/coffee/ProjectManager.coffee +++ b/services/document-updater/app/coffee/ProjectManager.coffee @@ -102,11 +102,17 @@ module.exports = ProjectManager = handleDocUpdate = (update, cb) -> doc_id = update.id - DocumentManager.renameDocWithLock project_id, doc_id, user_id, update, cb + if update.docLines? + RedisManager.addEntity project_id, 'doc', doc_id, user_id, update, cb + else + DocumentManager.renameDocWithLock project_id, doc_id, user_id, update, cb handleFileUpdate = (update, cb) -> file_id = update.id - RedisManager.renameFile project_id, file_id, user_id, update, cb + if update.url? + RedisManager.addEntity project_id, 'file', file_id, user_id, update, cb + else + RedisManager.renameFile project_id, file_id, user_id, update, cb async.each docUpdates, handleDocUpdate, (error) -> return callback(error) if error? diff --git a/services/document-updater/app/coffee/RedisManager.coffee b/services/document-updater/app/coffee/RedisManager.coffee index 56ce0fb9f9..df84947a22 100644 --- a/services/document-updater/app/coffee/RedisManager.coffee +++ b/services/document-updater/app/coffee/RedisManager.coffee @@ -300,6 +300,21 @@ module.exports = RedisManager = rclient.rpush projectHistoryKeys.projectHistoryOps({project_id}), jsonUpdate, callback + addEntity: (project_id, entity_type, entitiy_id, user_id, update, callback = (error) ->) -> + update = + pathname: update.pathname + docLines: update.docLines + url: update.url + meta: + user_id: user_id + ts: new Date() + update[entity_type] = entitiy_id + + logger.log {project_id, update}, "queue add operation to project-history" + jsonUpdate = JSON.stringify(update) + + rclient.rpush projectHistoryKeys.projectHistoryOps({project_id}), jsonUpdate, callback + clearUnflushedTime: (doc_id, callback = (error) ->) -> rclient.del keys.unflushedTime(doc_id:doc_id), callback diff --git a/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee b/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee index 7009405842..898479a8c7 100644 --- a/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee +++ b/services/document-updater/test/unit/coffee/ProjectManager/updateProjectTests.coffee @@ -19,55 +19,113 @@ describe "ProjectManager", -> @callback = sinon.stub() describe "updateProjectWithLocks", -> - beforeEach -> - @firstDocUpdate = - id: 1 - update: 'foo' - @secondDocUpdate = - id: 2 - update: 'bar' - @docUpdates = [ @firstDocUpdate, @secondDocUpdate ] - @firstFileUpdate = - id: 2 - update: 'bar' - @fileUpdates = [ @firstFileUpdate ] - @DocumentManager.renameDocWithLock = sinon.stub().yields() - @RedisManager.renameFile = sinon.stub().yields() - - describe "successfully", -> + describe "rename operations", -> beforeEach -> - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @firstDocUpdate = + id: 1 + pathname: 'foo' + newPathname: 'foo' + @secondDocUpdate = + id: 2 + pathname: 'bar' + newPathname: 'bar2' + @docUpdates = [ @firstDocUpdate, @secondDocUpdate ] + @firstFileUpdate = + id: 2 + pathname: 'bar' + newPathname: 'bar2' + @fileUpdates = [ @firstFileUpdate ] + @DocumentManager.renameDocWithLock = sinon.stub().yields() + @RedisManager.renameFile = sinon.stub().yields() - it "should rename the docs in the updates", -> - @DocumentManager.renameDocWithLock - .calledWith(@project_id, @firstDocUpdate.id, @user_id, @firstDocUpdate) - .should.equal true - @DocumentManager.renameDocWithLock - .calledWith(@project_id, @secondDocUpdate.id, @user_id, @secondDocUpdate) - .should.equal true + describe "successfully", -> + beforeEach -> + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback - it "should rename the files in the updates", -> - @RedisManager.renameFile - .calledWith(@project_id, @firstFileUpdate.id, @user_id, @firstFileUpdate) - .should.equal true + it "should rename the docs in the updates", -> + @DocumentManager.renameDocWithLock + .calledWith(@project_id, @firstDocUpdate.id, @user_id, @firstDocUpdate) + .should.equal true + @DocumentManager.renameDocWithLock + .calledWith(@project_id, @secondDocUpdate.id, @user_id, @secondDocUpdate) + .should.equal true - it "should call the callback", -> - @callback.called.should.equal true + it "should rename the files in the updates", -> + @RedisManager.renameFile + .calledWith(@project_id, @firstFileUpdate.id, @user_id, @firstFileUpdate) + .should.equal true - describe "when renaming a doc fails", -> + it "should call the callback", -> + @callback.called.should.equal true + + describe "when renaming a doc fails", -> + beforeEach -> + @error = new Error('error') + @DocumentManager.renameDocWithLock = sinon.stub().yields(@error) + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + + it "should call the callback with the error", -> + @callback.calledWith(@error).should.equal true + + describe "when renaming a file fails", -> + beforeEach -> + @error = new Error('error') + @RedisManager.renameFile = sinon.stub().yields(@error) + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + + it "should call the callback with the error", -> + @callback.calledWith(@error).should.equal true + + describe "add operations", -> beforeEach -> - @error = new Error('error') - @DocumentManager.renameDocWithLock = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + @firstDocUpdate = + id: 1 + docLines: "a\nb" + @secondDocUpdate = + id: 2 + docLines: "a\nb" + @docUpdates = [ @firstDocUpdate, @secondDocUpdate ] + @firstFileUpdate = + id: 2 + url: 'filestore.example.com/2' + @fileUpdates = [ @firstFileUpdate ] + @RedisManager.addEntity = sinon.stub().yields() - it "should call the callback with the error", -> - @callback.calledWith(@error).should.equal true + describe "successfully", -> + beforeEach -> + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback - describe "when renaming a file fails", -> - beforeEach -> - @error = new Error('error') - @RedisManager.renameFile = sinon.stub().yields(@error) - @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + it "should add the docs in the updates", -> + @RedisManager.addEntity + .calledWith(@project_id, 'doc', @firstDocUpdate.id, @user_id, @firstDocUpdate) + .should.equal true + @RedisManager.addEntity + .calledWith(@project_id, 'doc', @secondDocUpdate.id, @user_id, @secondDocUpdate) + .should.equal true + + it "should add the files in the updates", -> + @RedisManager.addEntity + .calledWith(@project_id, 'file', @firstFileUpdate.id, @user_id, @firstFileUpdate) + .should.equal true + + it "should call the callback", -> + @callback.called.should.equal true + + describe "when adding a doc fails", -> + beforeEach -> + @error = new Error('error') + @RedisManager.addEntity = sinon.stub().yields(@error) + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + + it "should call the callback with the error", -> + @callback.calledWith(@error).should.equal true + + describe "when adding a file fails", -> + beforeEach -> + @error = new Error('error') + @RedisManager.addEntity = sinon.stub().yields(@error) + @ProjectManager.updateProjectWithLocks @project_id, @user_id, @docUpdates, @fileUpdates, @callback + + it "should call the callback with the error", -> + @callback.calledWith(@error).should.equal true - it "should call the callback with the error", -> - @callback.calledWith(@error).should.equal true diff --git a/services/document-updater/test/unit/coffee/RedisManager/RedisManagerTests.coffee b/services/document-updater/test/unit/coffee/RedisManager/RedisManagerTests.coffee index 157c315b63..4cbac611b6 100644 --- a/services/document-updater/test/unit/coffee/RedisManager/RedisManagerTests.coffee +++ b/services/document-updater/test/unit/coffee/RedisManager/RedisManagerTests.coffee @@ -739,3 +739,30 @@ describe "RedisManager", -> @rclient.rpush .calledWith("ProjectHistory:Ops:#{@project_id}", JSON.stringify(update)) .should.equal true + + describe "addEntity", -> + beforeEach (done) -> + @rclient.rpush = sinon.stub().yields() + @entity_id = 1234 + @entity_type = 'type' + + @update = + pathname: @pathname = '/old' + docLines: @docLines = 'a\nb' + url: @url = 'filestore.example.com' + + @RedisManager.addEntity @project_id, @entity_type, @entity_id, @userId, @update, done + + it "should queue an update", -> + update = + pathname: @pathname + docLines: @docLines + url: @url + meta: + user_id: @user_id + ts: new Date() + update[@entity_type] = @entity_id + + @rclient.rpush + .calledWith("ProjectHistory:Ops:#{@project_id}", JSON.stringify(update)) + .should.equal true