Procházet zdrojové kódy

Begin work on indexing the references when project is opened.

Shane Kilkelly před 10 roky
rodič
revize
ca0a625dcc

+ 13 - 5
services/web/app/coffee/Features/Project/ProjectController.coffee

@@ -16,6 +16,8 @@ SecurityManager = require("../../managers/SecurityManager")
 fs = require "fs"
 fs = require "fs"
 InactiveProjectManager = require("../InactiveData/InactiveProjectManager")
 InactiveProjectManager = require("../InactiveData/InactiveProjectManager")
 ProjectUpdateHandler = require("./ProjectUpdateHandler")
 ProjectUpdateHandler = require("./ProjectUpdateHandler")
+ReferencesSearchHandler = require("../ReferencesSearch/ReferencesSearchHandler")
+
 
 
 module.exports = ProjectController =
 module.exports = ProjectController =
 
 
@@ -168,15 +170,15 @@ module.exports = ProjectController =
 			return res.render("general/closed", {title:"updating_site"})
 			return res.render("general/closed", {title:"updating_site"})
 
 
 		if req.session.user?
 		if req.session.user?
-			user_id = req.session.user._id 
+			user_id = req.session.user._id
 			anonymous = false
 			anonymous = false
 		else
 		else
 			anonymous = true
 			anonymous = true
 			user_id = 'openUser'
 			user_id = 'openUser'
-		
+
 		project_id = req.params.Project_id
 		project_id = req.params.Project_id
 		logger.log project_id:project_id, "loading editor"
 		logger.log project_id:project_id, "loading editor"
-	
+
 		async.parallel {
 		async.parallel {
 			project: (cb)->
 			project: (cb)->
 				Project.findPopulatedById project_id, cb
 				Project.findPopulatedById project_id, cb
@@ -193,7 +195,7 @@ module.exports = ProjectController =
 				SubscriptionLocator.getUsersSubscription user_id, cb
 				SubscriptionLocator.getUsersSubscription user_id, cb
 			activate: (cb)->
 			activate: (cb)->
 				InactiveProjectManager.reactivateProjectIfRequired project_id, cb
 				InactiveProjectManager.reactivateProjectIfRequired project_id, cb
-			markAsOpened: (cb)-> 
+			markAsOpened: (cb)->
 				#don't need to wait for this to complete
 				#don't need to wait for this to complete
 				ProjectUpdateHandler.markAsOpened project_id, ->
 				ProjectUpdateHandler.markAsOpened project_id, ->
 				cb()
 				cb()
@@ -205,6 +207,7 @@ module.exports = ProjectController =
 			user = results.user
 			user = results.user
 			subscription = results.subscription
 			subscription = results.subscription
 
 
+
 			daysSinceLastUpdated =  (new Date() - project.lastUpdated) /86400000
 			daysSinceLastUpdated =  (new Date() - project.lastUpdated) /86400000
 			logger.log project_id:project_id, daysSinceLastUpdated:daysSinceLastUpdated, "got db results for loading editor"
 			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?
 				if subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt?
 					allowedFreeTrial = !!subscription.freeTrial.allowed || true
 					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"
 				logger.log project_id:project_id, "rendering editor page"
 				res.render 'project/editor',
 				res.render 'project/editor',
 					title:  project.name
 					title:  project.name
@@ -311,4 +320,3 @@ do generateThemeList = () ->
 		if file.slice(-2) == "js" and file.match(/^theme-/)
 		if file.slice(-2) == "js" and file.match(/^theme-/)
 			cleanName = file.slice(0,-3).slice(6)
 			cleanName = file.slice(0,-3).slice(6)
 			THEME_LIST.push cleanName
 			THEME_LIST.push cleanName
-

+ 1 - 5
services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchController.coffee

@@ -21,8 +21,7 @@ module.exports = ReferencesSearchController =
 			if err?
 			if err?
 				logger.err {err, project_id, doc_id}, "error finding doc to index"
 				logger.err {err, project_id, doc_id}, "error finding doc to index"
 				return res.send 500
 				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
 				if err
 					logger.err {err, project_id, doc_id}, "error indexing references file"
 					logger.err {err, project_id, doc_id}, "error indexing references file"
 					return res.send 500
 					return res.send 500
@@ -37,6 +36,3 @@ module.exports = ReferencesSearchController =
 				logger.err {err, project_id}, "error getting references keys"
 				logger.err {err, project_id}, "error getting references keys"
 				return res.send 500
 				return res.send 500
 			return res.json data
 			return res.json data
-
-	_buildDocUrl: (project_id, doc_id) ->
-		"#{settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}"

+ 18 - 4
services/web/app/coffee/Features/ReferencesSearch/ReferencesSearchHandler.coffee

@@ -1,6 +1,8 @@
 logger = require("logger-sharelatex")
 logger = require("logger-sharelatex")
 request = require("request")
 request = require("request")
 settings = require("settings-sharelatex")
 settings = require("settings-sharelatex")
+ProjectLocator = require("../Project/ProjectLocator")
+U = require('underscore')
 
 
 oneMinInMs = 60 * 1000
 oneMinInMs = 60 * 1000
 fiveMinsInMs = oneMinInMs * 5
 fiveMinsInMs = oneMinInMs * 5
@@ -8,11 +10,20 @@ fiveMinsInMs = oneMinInMs * 5
 
 
 module.exports = ReferencesSearchHandler =
 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 {
 		request.post {
-			url: url
+			url: target_url
 			json:
 			json:
 				referencesUrl: file_url
 				referencesUrl: file_url
 		}, (err, res, result) ->
 		}, (err, res, result) ->
@@ -40,3 +51,6 @@ module.exports = ReferencesSearchHandler =
 				err = new Error("references api responded with non-success code: #{res.statusCode}")
 				err = new Error("references api responded with non-success code: #{res.statusCode}")
 				logger.log {err, project_id}, "error getting references keys"
 				logger.log {err, project_id}, "error getting references keys"
 				return callback(err)
 				return callback(err)
+
+	_buildDocUrl: (project_id, doc_id) ->
+		"#{settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}"

+ 3 - 0
services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee

@@ -46,6 +46,8 @@ describe "ProjectController", ->
 			reactivateProjectIfRequired:sinon.stub()
 			reactivateProjectIfRequired:sinon.stub()
 		@ProjectUpdateHandler =
 		@ProjectUpdateHandler =
 			markAsOpened: sinon.stub()
 			markAsOpened: sinon.stub()
+		@ReferencesSearchHandler =
+			indexProjectReferences: sinon.stub()
 		@ProjectController = SandboxedModule.require modulePath, requires:
 		@ProjectController = SandboxedModule.require modulePath, requires:
 			"settings-sharelatex":@settings
 			"settings-sharelatex":@settings
 			"logger-sharelatex": 
 			"logger-sharelatex": 
@@ -63,6 +65,7 @@ describe "ProjectController", ->
 			"../../managers/SecurityManager":@SecurityManager
 			"../../managers/SecurityManager":@SecurityManager
 			"../InactiveData/InactiveProjectManager":@InactiveProjectManager
 			"../InactiveData/InactiveProjectManager":@InactiveProjectManager
 			"./ProjectUpdateHandler":@ProjectUpdateHandler
 			"./ProjectUpdateHandler":@ProjectUpdateHandler
+			"../ReferencesSearch/ReferencesSearchHandler": @ReferencesSearchHandler
 
 
 		@user = 
 		@user = 
 			_id:"!£123213kjljkl"
 			_id:"!£123213kjljkl"

+ 2 - 4
services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchControllerTests.coffee

@@ -110,9 +110,8 @@ describe "ReferencesSearchController", ->
 			it 'should call ReferencesSearchHandler.indexFile', (done) ->
 			it 'should call ReferencesSearchHandler.indexFile', (done) ->
 				@res.send = (status) =>
 				@res.send = (status) =>
 					@ReferencesSearchHandler.indexFile.calledOnce.should.equal true
 					@ReferencesSearchHandler.indexFile.calledOnce.should.equal true
-					expected_url = "http://some.url/project/2222/doc/3333"
 					@ReferencesSearchHandler.indexFile
 					@ReferencesSearchHandler.indexFile
-					.calledWith(@project_id, expected_url).should.equal true
+					.calledWith(@project_id, @doc_id).should.equal true
 					done()
 					done()
 				@controller.indexFile(@req, @res)
 				@controller.indexFile(@req, @res)
 
 
@@ -162,9 +161,8 @@ describe "ReferencesSearchController", ->
 			it 'should call ReferencesSearchHandler.indexFile', (done) ->
 			it 'should call ReferencesSearchHandler.indexFile', (done) ->
 				@res.send = (status) =>
 				@res.send = (status) =>
 					@ReferencesSearchHandler.indexFile.calledOnce.should.equal true
 					@ReferencesSearchHandler.indexFile.calledOnce.should.equal true
-					expected_url = "http://some.url/project/2222/doc/3333"
 					@ReferencesSearchHandler.indexFile
 					@ReferencesSearchHandler.indexFile
-					.calledWith(@project_id, expected_url).should.equal true
+					.calledWith(@project_id, @doc_id).should.equal true
 					done()
 					done()
 				@controller.indexFile(@req, @res)
 				@controller.indexFile(@req, @res)
 
 

+ 6 - 4
services/web/test/UnitTests/coffee/ReferencesSearch/ReferencesSearchHandlerTests.coffee

@@ -9,14 +9,16 @@ describe 'ReferencesSearchHandler', ->
 
 
 	beforeEach ->
 	beforeEach ->
 		@project_id = '222'
 		@project_id = '222'
-		@file_url = 'http://example.com/some/file'
+		@file_id = '111111'
 		@handler = SandboxedModule.require modulePath, requires:
 		@handler = SandboxedModule.require modulePath, requires:
 			'logger-sharelatex': {
 			'logger-sharelatex': {
 				log: ->
 				log: ->
 				err: ->
 				err: ->
 			}
 			}
 			'settings-sharelatex': @settings = {
 			'settings-sharelatex': @settings = {
-				apis: {references: {url: 'http://some.url'}}
+				apis:
+					references: {url: 'http://some.url'}
+					web: {url: 'http://some.url'}
 			}
 			}
 			'request': @request = {
 			'request': @request = {
 				get: sinon.stub()
 				get: sinon.stub()
@@ -30,7 +32,7 @@ describe 'ReferencesSearchHandler', ->
 				@request.post.callsArgWith(1, null, {statusCode: 201}, {})
 				@request.post.callsArgWith(1, null, {statusCode: 201}, {})
 
 
 			it 'should not produce an error', (done) ->
 			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
 					expect(err).to.equal null
 					done()
 					done()
 
 
@@ -39,7 +41,7 @@ describe 'ReferencesSearchHandler', ->
 				@request.post.callsArgWith(1, null, {statusCode: 500}, {})
 				@request.post.callsArgWith(1, null, {statusCode: 500}, {})
 
 
 			it 'should produce an error', (done) ->
 			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
 					expect(err).to.not.equal null
 					done()
 					done()