Begin work on indexing the references when project is opened.

This commit is contained in:
Shane Kilkelly 2016-01-14 14:53:08 +00:00
parent 6244d013af
commit ca0a625dcc
6 changed files with 43 additions and 22 deletions

View file

@ -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

View file

@ -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}"

View file

@ -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}"

View file

@ -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"

View file

@ -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)

View file

@ -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()