From ca0a625dccf674bd45c0fccdbeb0687c23a3f58a Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 14 Jan 2016 14:53:08 +0000 Subject: [PATCH] Begin work on indexing the references when project is opened. --- .../Features/Project/ProjectController.coffee | 18 ++++++++++----- .../ReferencesSearchController.coffee | 6 +---- .../ReferencesSearchHandler.coffee | 22 +++++++++++++++---- .../Project/ProjectControllerTests.coffee | 3 +++ .../ReferencesSearchControllerTests.coffee | 6 ++--- .../ReferencesSearchHandlerTests.coffee | 10 +++++---- 6 files changed, 43 insertions(+), 22 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 67c863bde4..69e5a95d7e 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -16,6 +16,8 @@ SecurityManager = require("../../managers/SecurityManager") fs = require "fs" InactiveProjectManager = require("../InactiveData/InactiveProjectManager") ProjectUpdateHandler = require("./ProjectUpdateHandler") +ReferencesSearchHandler = require("../ReferencesSearch/ReferencesSearchHandler") + module.exports = ProjectController = @@ -168,15 +170,15 @@ module.exports = ProjectController = return res.render("general/closed", {title:"updating_site"}) if req.session.user? - user_id = req.session.user._id + user_id = req.session.user._id anonymous = false else anonymous = true user_id = 'openUser' - + project_id = req.params.Project_id logger.log project_id:project_id, "loading editor" - + async.parallel { project: (cb)-> Project.findPopulatedById project_id, cb @@ -193,7 +195,7 @@ module.exports = ProjectController = SubscriptionLocator.getUsersSubscription user_id, cb activate: (cb)-> InactiveProjectManager.reactivateProjectIfRequired project_id, cb - markAsOpened: (cb)-> + markAsOpened: (cb)-> #don't need to wait for this to complete ProjectUpdateHandler.markAsOpened project_id, -> cb() @@ -205,6 +207,7 @@ module.exports = ProjectController = user = results.user subscription = results.subscription + daysSinceLastUpdated = (new Date() - project.lastUpdated) /86400000 logger.log project_id:project_id, daysSinceLastUpdated:daysSinceLastUpdated, "got db results for loading editor" @@ -214,6 +217,12 @@ module.exports = ProjectController = if subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt? allowedFreeTrial = !!subscription.freeTrial.allowed || true + + # TODO: need to search for all docs in project + rootDocs = project?.rootFolder?[0]?.docs + if rootDocs + ReferencesSearchHandler.indexProjectReferences project_id, rootDocs -> # don't need to wait on this + logger.log project_id:project_id, "rendering editor page" res.render 'project/editor', title: project.name @@ -311,4 +320,3 @@ do generateThemeList = () -> if file.slice(-2) == "js" and file.match(/^theme-/) cleanName = file.slice(0,-3).slice(6) THEME_LIST.push cleanName - diff --git a/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchController.coffee b/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchController.coffee index b81355dc24..5926041ef9 100644 --- a/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchController.coffee +++ b/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchController.coffee @@ -21,8 +21,7 @@ module.exports = ReferencesSearchController = if err? logger.err {err, project_id, doc_id}, "error finding doc to index" return res.send 500 - doc_url = ReferencesSearchController._buildDocUrl project_id, doc_id - ReferencesSearchHandler.indexFile project_id, doc_url, (err) -> + ReferencesSearchHandler.indexFile project_id, doc_id, (err) -> if err logger.err {err, project_id, doc_id}, "error indexing references file" return res.send 500 @@ -37,6 +36,3 @@ module.exports = ReferencesSearchController = logger.err {err, project_id}, "error getting references keys" return res.send 500 return res.json data - - _buildDocUrl: (project_id, doc_id) -> - "#{settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}" diff --git a/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchHandler.coffee b/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchHandler.coffee index 9ae6143408..d7fa5b8f14 100644 --- a/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchHandler.coffee +++ b/services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchHandler.coffee @@ -1,6 +1,8 @@ logger = require("logger-sharelatex") request = require("request") settings = require("settings-sharelatex") +ProjectLocator = require("../Project/ProjectLocator") +U = require('underscore') oneMinInMs = 60 * 1000 fiveMinsInMs = oneMinInMs * 5 @@ -8,11 +10,20 @@ fiveMinsInMs = oneMinInMs * 5 module.exports = ReferencesSearchHandler = - indexFile: (project_id, file_url, callback = (err)->) -> - logger.log {project_id, file_url}, "sending index request to references api" - url = "#{settings.apis.references.url}/project/#{project_id}" + indexProjectReferences: (project_id, docs, callback = (err) ->) -> + logger.log {project_id}, "try indexing references from project" + bibDocs = U.filter(docs, (doc) -> doc?.name?.match(/^.*\.bib$/)) + if bibDocs and bibDocs.length == 1 # presume we'll only get either one or zero bib files + doc = bibDocs[0] + ReferencesSearchHandler.indexFile project_id, doc._id, (err) -> + callback(err) + + indexFile: (project_id, file_id, callback = (err)->) -> + logger.log {project_id, file_id}, "sending index request to references api" + target_url = "#{settings.apis.references.url}/project/#{project_id}" + file_url = ReferencesSearchHandler._buildDocUrl project_id, file_id request.post { - url: url + url: target_url json: referencesUrl: file_url }, (err, res, result) -> @@ -40,3 +51,6 @@ module.exports = ReferencesSearchHandler = err = new Error("references api responded with non-success code: #{res.statusCode}") logger.log {err, project_id}, "error getting references keys" return callback(err) + + _buildDocUrl: (project_id, doc_id) -> + "#{settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}" diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index d95dbb97b9..7fe296d4d0 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -46,6 +46,8 @@ describe "ProjectController", -> reactivateProjectIfRequired:sinon.stub() @ProjectUpdateHandler = markAsOpened: sinon.stub() + @ReferencesSearchHandler = + indexProjectReferences: sinon.stub() @ProjectController = SandboxedModule.require modulePath, requires: "settings-sharelatex":@settings "logger-sharelatex": @@ -63,6 +65,7 @@ describe "ProjectController", -> "../../managers/SecurityManager":@SecurityManager "../InactiveData/InactiveProjectManager":@InactiveProjectManager "./ProjectUpdateHandler":@ProjectUpdateHandler + "../ReferencesSearch/ReferencesSearchHandler": @ReferencesSearchHandler @user = _id:"!£123213kjljkl" diff --git a/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchControllerTests.coffee b/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchControllerTests.coffee index d33c6e4a47..985a392fed 100644 --- a/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchControllerTests.coffee @@ -110,9 +110,8 @@ describe "ReferencesSearchController", -> it 'should call ReferencesSearchHandler.indexFile', (done) -> @res.send = (status) => @ReferencesSearchHandler.indexFile.calledOnce.should.equal true - expected_url = "http://some.url/project/2222/doc/3333" @ReferencesSearchHandler.indexFile - .calledWith(@project_id, expected_url).should.equal true + .calledWith(@project_id, @doc_id).should.equal true done() @controller.indexFile(@req, @res) @@ -162,9 +161,8 @@ describe "ReferencesSearchController", -> it 'should call ReferencesSearchHandler.indexFile', (done) -> @res.send = (status) => @ReferencesSearchHandler.indexFile.calledOnce.should.equal true - expected_url = "http://some.url/project/2222/doc/3333" @ReferencesSearchHandler.indexFile - .calledWith(@project_id, expected_url).should.equal true + .calledWith(@project_id, @doc_id).should.equal true done() @controller.indexFile(@req, @res) diff --git a/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchHandlerTests.coffee b/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchHandlerTests.coffee index e4cb1f8af9..987d2e81f7 100644 --- a/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchHandlerTests.coffee @@ -9,14 +9,16 @@ describe 'ReferencesSearchHandler', -> beforeEach -> @project_id = '222' - @file_url = 'http://example.com/some/file' + @file_id = '111111' @handler = SandboxedModule.require modulePath, requires: 'logger-sharelatex': { log: -> err: -> } 'settings-sharelatex': @settings = { - apis: {references: {url: 'http://some.url'}} + apis: + references: {url: 'http://some.url'} + web: {url: 'http://some.url'} } 'request': @request = { get: sinon.stub() @@ -30,7 +32,7 @@ describe 'ReferencesSearchHandler', -> @request.post.callsArgWith(1, null, {statusCode: 201}, {}) it 'should not produce an error', (done) -> - @handler.indexFile @project_id, @file_url, (err) => + @handler.indexFile @project_id, @file_id, (err) => expect(err).to.equal null done() @@ -39,7 +41,7 @@ describe 'ReferencesSearchHandler', -> @request.post.callsArgWith(1, null, {statusCode: 500}, {}) it 'should produce an error', (done) -> - @handler.indexFile @project_id, @file_url, (err) => + @handler.indexFile @project_id, @file_id, (err) => expect(err).to.not.equal null done()