From 8315de58c72970d19174b9bdc3fa52e1a0755dc1 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 8 May 2014 13:42:30 +0100 Subject: [PATCH] Proxy get doc requests to the docstore --- .../Features/Docstore/DocstoreManager.coffee | 18 +++++++- .../Documents/DocumentController.coffee | 10 ++--- .../Project/ProjectEntityHandler.coffee | 3 ++ .../Docstore/DocstoreManagerTests.coffee | 42 ++++++++++++++++++- .../Documents/DocumentControllerTests.coffee | 15 +++---- .../Project/ProjectEntityHandlerTests.coffee | 17 ++++++++ 6 files changed, 90 insertions(+), 15 deletions(-) diff --git a/services/web/app/coffee/Features/Docstore/DocstoreManager.coffee b/services/web/app/coffee/Features/Docstore/DocstoreManager.coffee index c3ceeb5a35..88dde1393f 100644 --- a/services/web/app/coffee/Features/Docstore/DocstoreManager.coffee +++ b/services/web/app/coffee/Features/Docstore/DocstoreManager.coffee @@ -27,7 +27,23 @@ module.exports = DocstoreManager = callback(null, docs) else error = new Error("docstore api responded with non-success code: #{res.statusCode}") - logger.error err: error, project_id: project_id, "error getting all docs in docstore" + logger.error err: error, project_id: project_id, "error getting all docs from docstore" + callback(error) + + getDoc: (project_id, doc_id, callback = (error, lines, version, rev) ->) -> + logger.log project_id: project_id, doc_id: doc_id, "getting doc in docstore api" + url = "#{settings.apis.docstore.url}/project/#{project_id}/doc/#{doc_id}" + request.get { + url: url + json: true + }, (error, res, doc) -> + return callback(error) if error? + if 200 <= res.statusCode < 300 + logger.log doc_id: doc_id, project_id: project_id, version: doc.version, rev: doc.rev, "got doc from docstore api" + callback(null, doc.lines, doc.version, doc.rev) + else + error = new Error("docstore api responded with non-success code: #{res.statusCode}") + logger.error err: error, project_id: project_id, doc_id: doc_id, "error getting doc from docstore" callback(error) updateDoc: (project_id, doc_id, lines, version, callback = (error, rev) ->) -> diff --git a/services/web/app/coffee/Features/Documents/DocumentController.coffee b/services/web/app/coffee/Features/Documents/DocumentController.coffee index bc6fda789b..6e6f33665a 100644 --- a/services/web/app/coffee/Features/Documents/DocumentController.coffee +++ b/services/web/app/coffee/Features/Documents/DocumentController.coffee @@ -1,25 +1,23 @@ -ProjectLocator = require "../Project/ProjectLocator" ProjectEntityHandler = require "../Project/ProjectEntityHandler" Errors = require "../../errors" logger = require("logger-sharelatex") -module.exports = - +module.exports = getDocument: (req, res, next = (error) ->) -> project_id = req.params.Project_id doc_id = req.params.doc_id logger.log doc_id:doc_id, project_id:project_id, "receiving get document request from api (docupdater)" - ProjectLocator.findElement project_id: project_id, element_id: doc_id, type: "doc", (error, doc) -> + ProjectEntityHandler.getDoc project_id, doc_id, (error, lines, version, rev) -> if error? logger.err err:error, doc_id:doc_id, project_id:project_id, "error finding element for getDocument" return next(error) res.type "json" res.send JSON.stringify { - lines: doc.lines + lines: lines + version: version } req.session.destroy() - setDocument: (req, res, next = (error) ->) -> project_id = req.params.Project_id doc_id = req.params.doc_id diff --git a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee index ffcf0e0d3e..bc6b579a43 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee @@ -111,6 +111,9 @@ module.exports = ProjectEntityHandler = logger.log sl_req_id: sl_req_id, project_id: project_id, "removing root doc" Project.update {_id:project_id}, {$unset: {rootDoc_id: true}}, {}, callback + getDoc: (project_id, doc_id, callback = (error, lines, version, rev) ->) -> + DocstoreManager.getDoc project_id, doc_id, callback + addDoc: (project_or_id, folder_id, docName, docLines, sl_req_id, callback = (error, doc, folder_id) ->)=> {callback, sl_req_id} = slReqIdHelper.getCallbackAndReqId(callback, sl_req_id) Project.getProject project_or_id, "", (err, project) -> diff --git a/services/web/test/UnitTests/coffee/Docstore/DocstoreManagerTests.coffee b/services/web/test/UnitTests/coffee/Docstore/DocstoreManagerTests.coffee index f54bde7832..b29d7812e0 100644 --- a/services/web/test/UnitTests/coffee/Docstore/DocstoreManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Docstore/DocstoreManagerTests.coffee @@ -92,6 +92,46 @@ describe "DocstoreManager", -> }, "error updating doc in docstore") .should.equal true + describe "getDoc", -> + beforeEach -> + @doc = + lines: @lines = ["mock", "doc", "lines"] + version: @version = 42 + rev: @rev = 5 + + describe "with a successful response code", -> + beforeEach -> + @request.get = sinon.stub().callsArgWith(1, null, statusCode: 204, @doc) + @DocstoreManager.getDoc @project_id, @doc_id, @callback + + it "should get the doc from the docstore api", -> + @request.get + .calledWith({ + url: "#{@settings.apis.docstore.url}/project/#{@project_id}/doc/#{@doc_id}" + json: true + }) + .should.equal true + + it "should call the callback with the lines, version and rev", -> + @callback.calledWith(null, @lines, @version, @rev).should.equal true + + describe "with a failed response code", -> + beforeEach -> + @request.get = sinon.stub().callsArgWith(1, null, statusCode: 500, "") + @DocstoreManager.getDoc @project_id, @doc_id, @callback + + it "should call the callback with an error", -> + @callback.calledWith(new Error("docstore api responded with non-success code: 500")).should.equal true + + it "should log the error", -> + @logger.error + .calledWith({ + err: new Error("docstore api responded with a non-success code: 500") + project_id: @project_id + doc_id: @doc_id + }, "error getting doc from docstore") + .should.equal true + describe "getAllDocs", -> describe "with a successful response code", -> beforeEach -> @@ -122,5 +162,5 @@ describe "DocstoreManager", -> .calledWith({ err: new Error("docstore api responded with a non-success code: 500") project_id: @project_id - }, "error getting all docs in docstore") + }, "error getting all docs from docstore") .should.equal true diff --git a/services/web/test/UnitTests/coffee/Documents/DocumentControllerTests.coffee b/services/web/test/UnitTests/coffee/Documents/DocumentControllerTests.coffee index c5f62fe792..eac78ce97a 100644 --- a/services/web/test/UnitTests/coffee/Documents/DocumentControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Documents/DocumentControllerTests.coffee @@ -11,8 +11,7 @@ Errors = require "../../../../app/js/errors" describe "DocumentController", -> beforeEach -> - @DocumentController = SandboxedModule.require modulePath, requires: - "../Project/ProjectLocator": @ProjectLocator = {} + @DocumentController = SandboxedModule.require modulePath, requires: "../Project/ProjectEntityHandler": @ProjectEntityHandler = {} @res = new MockResponse() @req = new MockRequest() @@ -20,32 +19,34 @@ describe "DocumentController", -> @project_id = "project-id-123" @doc_id = "doc-id-123" @doc_lines = ["one", "two", "three"] + @version = 42 + @rev = 5 describe "getDocument", -> beforeEach -> @req.params = Project_id: @project_id doc_id: @doc_id - describe "when the document exists", -> beforeEach -> - @ProjectLocator.findElement = sinon.stub().callsArgWith(1, null, lines: @doc_lines) + @ProjectEntityHandler.getDoc = sinon.stub().callsArgWith(2, null, @doc_lines, @version, @rev) @DocumentController.getDocument(@req, @res, @next) it "should get the document from Mongo", -> - @ProjectLocator.findElement - .calledWith(project_id: @project_id, element_id: @doc_id, type: "doc") + @ProjectEntityHandler.getDoc + .calledWith(@project_id, @doc_id) .should.equal true it "should return the document data to the client as JSON", -> @res.type.should.equal "json" @res.body.should.equal JSON.stringify lines: @doc_lines + version: @version describe "when the document doesn't exist", -> beforeEach -> - @ProjectLocator.findElement = sinon.stub().callsArgWith(1, new Errors.NotFoundError("not found"), null) + @ProjectEntityHandler.getDoc = sinon.stub().callsArgWith(2, new Errors.NotFoundError("not found"), null) @DocumentController.getDocument(@req, @res, @next) it "should call next with the NotFoundError", -> diff --git a/services/web/test/UnitTests/coffee/Project/ProjectEntityHandlerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectEntityHandlerTests.coffee index 89ac18cd71..4b8fe460a2 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectEntityHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectEntityHandlerTests.coffee @@ -10,6 +10,7 @@ tk = require 'timekeeper' describe 'ProjectEntityHandler', -> project_id = '4eecb1c1bffa66588e0000a1' + doc_id = '4eecb1c1bffa66588e0000a2' folder_id = "4eecaffcbffa66588e000008" rootFolderId = "4eecaffcbffa66588e000007" @@ -279,6 +280,22 @@ describe 'ProjectEntityHandler', -> done() @ProjectEntityHandler._removeElementFromMongoArray model, id, mongoPath, -> + describe 'getDoc', -> + beforeEach -> + @lines = ["mock", "doc", "lines"] + @version = 42 + @rev = 5 + @DocstoreManager.getDoc = sinon.stub().callsArgWith(2, null, @lines, @version, @rev) + @ProjectEntityHandler.getDoc project_id, doc_id, @callback + + it "should call the docstore", -> + @DocstoreManager.getDoc + .calledWith(project_id, doc_id) + .should.equal true + + it "should call the callback with the lines, version and rev", -> + @callback.calledWith(null, @lines, @version, @rev).should.equal true + describe 'addDoc', -> beforeEach -> @name = "some new doc"