From fb9ca430de2bde1ba07fd0fca386fe53e4f933a6 Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Sat, 9 Jun 2018 12:02:23 +0100 Subject: [PATCH 1/2] export status endpoint --- .../Features/Exports/ExportsController.coffee | 10 ++++++++++ .../Features/Exports/ExportsHandler.coffee | 16 ++++++++++++++++ services/web/app/coffee/router.coffee | 1 + 3 files changed, 27 insertions(+) diff --git a/services/web/app/coffee/Features/Exports/ExportsController.coffee b/services/web/app/coffee/Features/Exports/ExportsController.coffee index 40cb7bb507..7c74d14aed 100644 --- a/services/web/app/coffee/Features/Exports/ExportsController.coffee +++ b/services/web/app/coffee/Features/Exports/ExportsController.coffee @@ -27,3 +27,13 @@ module.exports = "exported project" res.send export_v1_id: export_data.v1_id + exportStatus: (req, res) -> + {export_id} = req.params + ExportsHandler.fetchExport export_id, (err, export_json) -> + return next(err) if err? + parsed_export = JSON.parse(export_json) + json = { + status_summary: parsed_export.status_summary, + status_detail: parsed_export.status_detail + } + res.send export_json: json diff --git a/services/web/app/coffee/Features/Exports/ExportsHandler.coffee b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee index 38357c129d..167dc8bba0 100644 --- a/services/web/app/coffee/Features/Exports/ExportsHandler.coffee +++ b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee @@ -98,3 +98,19 @@ module.exports = ExportsHandler = self = err = new Error("project history version returned a failure status code: #{res.statusCode}") logger.err err:err, project_id:project_id, "project history version returned failure status code: #{res.statusCode}" callback err + + fetchExport: (export_id, callback=(err, export_json) ->) -> + request.get { + url: "#{settings.apis.v1.url}/api/v1/sharelatex/exports/#{export_id}" + auth: {user: settings.apis.v1.user, pass: settings.apis.v1.pass } + }, (err, res, body) -> + console.log(body) + if err? + logger.err err:err, export:export_id, "error making request to v1 export" + callback err + else if 200 <= res.statusCode < 300 + callback null, body + else + err = new Error("v1 export returned a failure status code: #{res.statusCode}") + logger.err err:err, export:export_id, "v1 export returned failure status code: #{res.statusCode}" + callback err diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 22c4abe925..7c4db9c568 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -214,6 +214,7 @@ module.exports = class Router privateApiRouter.post "/project/:Project_id/history/resync", AuthenticationController.httpAuth, HistoryController.resyncProjectHistory webRouter.post '/project/:project_id/export/:brand_variation_id', AuthorizationMiddlewear.ensureUserCanAdminProject, ExportsController.exportProject + webRouter.get '/project/:project_id/export/:export_id', AuthorizationMiddlewear.ensureUserCanAdminProject, ExportsController.exportStatus webRouter.get '/Project/:Project_id/download/zip', AuthorizationMiddlewear.ensureUserCanReadProject, ProjectDownloadsController.downloadProject webRouter.get '/project/download/zip', AuthorizationMiddlewear.ensureUserCanReadMultipleProjects, ProjectDownloadsController.downloadMultipleProjects From 0321780eba458d8b4a062cd039597bce47d411fc Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Sat, 9 Jun 2018 13:23:07 +0100 Subject: [PATCH 2/2] adding tests for exports status checker --- .../Features/Exports/ExportsHandler.coffee | 1 - .../Exports/ExportsControllerTests.coffee | 12 +++++++ .../coffee/Exports/ExportsHandlerTests.coffee | 31 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Exports/ExportsHandler.coffee b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee index 167dc8bba0..adedfc582b 100644 --- a/services/web/app/coffee/Features/Exports/ExportsHandler.coffee +++ b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee @@ -104,7 +104,6 @@ module.exports = ExportsHandler = self = url: "#{settings.apis.v1.url}/api/v1/sharelatex/exports/#{export_id}" auth: {user: settings.apis.v1.user, pass: settings.apis.v1.pass } }, (err, res, body) -> - console.log(body) if err? logger.err err:err, export:export_id, "error making request to v1 export" callback err diff --git a/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee b/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee index 821eb5b4e0..7ec568cede 100644 --- a/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee +++ b/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee @@ -37,3 +37,15 @@ describe 'ExportsController', -> @controller.exportProject @req, send:(body) => expect(body).to.deep.equal {export_v1_id: 897} done() + + it 'should ask the handler to return the status of an export', (done) -> + @handler.fetchExport = sinon.stub().yields( + null, + "{\"id\":897, \"status_summary\":\"completed\"}") + + @req.params = {project_id: project_id, export_id: 897} + @controller.exportStatus @req, send:(body) => + expect(body).to.deep.equal {export_json: { + status_summary: 'completed', status_detail: undefined + }} + done() diff --git a/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee b/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee index f10f4631c1..e8beccddf9 100644 --- a/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee +++ b/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee @@ -235,3 +235,34 @@ describe 'ExportsHandler', -> it "should return the error", -> (@callback.args[0][0] instanceof Error) .should.equal true + + describe 'fetchExport', -> + beforeEach (done) -> + @settings.apis = + v1: + url: 'http://localhost:5000' + user: 'overleaf' + pass: 'pass' + @export_id = 897 + @body = "{\"id\":897, \"status_summary\":\"completed\"}" + @stubGet = sinon.stub().yields(null, {statusCode: 200}, { body: @body }) + done() + + describe "when all goes well", -> + beforeEach (done) -> + @stubRequest.get = @stubGet + @ExportsHandler.fetchExport @export_id, (error, body) => + @callback(error, body) + done() + + it 'should issue the request', -> + expect(@stubGet.getCall(0).args[0]).to.deep.equal + url: @settings.apis.v1.url + '/api/v1/sharelatex/exports/' + @export_id + auth: + user: @settings.apis.v1.user + pass: @settings.apis.v1.pass + + it 'should return the v1 export id', -> + @callback.calledWith(null, { body: @body }) + .should.equal true +