diff --git a/services/document-updater/app.coffee b/services/document-updater/app.coffee index e3aee88bf7..96c7514f64 100644 --- a/services/document-updater/app.coffee +++ b/services/document-updater/app.coffee @@ -54,7 +54,7 @@ app.post '/project/:project_id/get_and_flush_if_old', HttpCont app.post '/project/:project_id/clearState', HttpController.clearProjectState app.post '/project/:project_id/doc/:doc_id', HttpController.setDoc app.post '/project/:project_id/doc/:doc_id/flush', HttpController.flushDocIfLoaded -app.delete '/project/:project_id/doc/:doc_id', HttpController.flushAndDeleteDoc +app.delete '/project/:project_id/doc/:doc_id', HttpController.deleteDoc app.delete '/project/:project_id', HttpController.deleteProject app.delete '/project', HttpController.deleteMultipleProjects app.post '/project/:project_id', HttpController.updateProject diff --git a/services/document-updater/app/coffee/DocumentManager.coffee b/services/document-updater/app/coffee/DocumentManager.coffee index 59db98e97f..1920e05777 100644 --- a/services/document-updater/app/coffee/DocumentManager.coffee +++ b/services/document-updater/app/coffee/DocumentManager.coffee @@ -222,6 +222,10 @@ module.exports = DocumentManager = UpdateManager = require "./UpdateManager" UpdateManager.lockUpdatesAndDo DocumentManager.flushAndDeleteDoc, project_id, doc_id, callback + deleteDocWithLock: (project_id, doc_id, callback) -> + UpdateManager = require "./UpdateManager" + UpdateManager.lockUpdatesAndDo RedisManager.removeDocFromMemory, project_id, doc_id, callback + acceptChangesWithLock: (project_id, doc_id, change_ids, callback = (error) ->) -> UpdateManager = require "./UpdateManager" UpdateManager.lockUpdatesAndDo DocumentManager.acceptChanges, project_id, doc_id, change_ids, callback diff --git a/services/document-updater/app/coffee/HttpController.coffee b/services/document-updater/app/coffee/HttpController.coffee index e2e2e712bc..e1b1a57d7b 100644 --- a/services/document-updater/app/coffee/HttpController.coffee +++ b/services/document-updater/app/coffee/HttpController.coffee @@ -103,20 +103,28 @@ module.exports = HttpController = logger.log project_id: project_id, doc_id: doc_id, "flushed doc via http" res.send 204 # No Content - flushAndDeleteDoc: (req, res, next = (error) ->) -> + deleteDoc: (req, res, next = (error) ->) -> doc_id = req.params.doc_id project_id = req.params.project_id - logger.log project_id: project_id, doc_id: doc_id, "deleting doc via http" + flush = req.body.flush ? true + logger.log project_id: project_id, doc_id: doc_id, flush: flush, "deleting doc via http" timer = new Metrics.Timer("http.deleteDoc") - DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) -> - timer.done() - # There is no harm in flushing project history if the previous call - # failed and sometimes it is required - HistoryManager.flushProjectChangesAsync project_id + if flush + DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) -> + timer.done() + # There is no harm in flushing project history if the previous call + # failed and sometimes it is required + HistoryManager.flushProjectChangesAsync project_id - return next(error) if error? - logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http" - res.send 204 # No Content + return next(error) if error? + logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http" + res.send 204 # No Content + else + DocumentManager.deleteDocWithLock project_id, doc_id, (error) -> + timer.done() + return next(error) if error? + logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http" + res.send 204 # No Content flushProject: (req, res, next = (error) ->) -> project_id = req.params.project_id diff --git a/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee b/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee index b8ace494f5..d816babead 100644 --- a/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee +++ b/services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee @@ -264,18 +264,19 @@ describe "HttpController", -> @next .calledWith(new Error("oops")) .should.equal true - - describe "flushAndDeleteDoc", -> + + describe "deleteDoc", -> beforeEach -> @req = params: project_id: @project_id doc_id: @doc_id + body: {} describe "successfully", -> beforeEach -> @DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(2) - @HttpController.flushAndDeleteDoc(@req, @res, @next) + @HttpController.deleteDoc(@req, @res, @next) it "should flush and delete the doc", -> @DocumentManager.flushAndDeleteDocWithLock @@ -294,16 +295,28 @@ describe "HttpController", -> it "should log the request", -> @logger.log - .calledWith(doc_id: @doc_id, project_id: @project_id, "deleting doc via http") + .calledWith(doc_id: @doc_id, project_id: @project_id, flush: true, "deleting doc via http") .should.equal true it "should time the request", -> @Metrics.Timer::done.called.should.equal true + describe "without flush", -> + beforeEach -> + @req.body.flush = false + @DocumentManager.deleteDocWithLock = sinon.stub().yields() + @HttpController.deleteDoc(@req, @res, @next) + + it "should delete the doc", -> + @DocumentManager.deleteDocWithLock.calledWith(@project_id, @doc_id).should.equal true + + it "should return a successful No Content response", -> + @res.send.calledWith(204).should.equal true + describe "when an errors occurs", -> beforeEach -> @DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(2, new Error("oops")) - @HttpController.flushAndDeleteDoc(@req, @res, @next) + @HttpController.deleteDoc(@req, @res, @next) it "should flush project history", -> @HistoryManager.flushProjectChangesAsync