mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Add a "flush: false" option to the doc delete endpoint
This will delete the document from Redis without flushing to web, docstore or history. To be used when something is broken.
This commit is contained in:
parent
dec18e0773
commit
c09bc0e868
4 changed files with 41 additions and 16 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue