ReferencesSearchHandler.coffee 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. logger = require("logger-sharelatex")
  2. request = require("request")
  3. settings = require("settings-sharelatex")
  4. Project = require("../../models/Project").Project
  5. U = require('underscore')
  6. Async = require('async')
  7. oneMinInMs = 60 * 1000
  8. fiveMinsInMs = oneMinInMs * 5
  9. module.exports = ReferencesSearchHandler =
  10. _buildDocUrl: (projectId, docId) ->
  11. "#{settings.apis.web.url}/project/#{projectId}/doc/#{docId}"
  12. _findBibDocIds: (project) ->
  13. ids = []
  14. _process = (folder) ->
  15. folder.docs.forEach (doc) ->
  16. if doc?.name?.match(/^.*\.bib$/)
  17. ids.push(doc._id)
  18. folder.folders.forEach (folder) ->
  19. _process(folder)
  20. project.rootFolder.forEach (rootFolder) ->
  21. _process(rootFolder)
  22. return ids
  23. _isFullIndex: (project, callback = (err, result) ->) ->
  24. owner = project.owner_ref
  25. callback(null, owner.features.references == true)
  26. # projectId: String, docIds: List[String]|Null
  27. index: (projectId, docIds, callback=(err, data)->) ->
  28. Project.findPopulatedById projectId, (err, project) ->
  29. if err
  30. logger.err {err, projectId}, "error finding project"
  31. return callback(err)
  32. if docIds == "ALL"
  33. logger.log {projectId}, "indexing all bib files in project"
  34. docIds = ReferencesSearchHandler._findBibDocIds(project)
  35. ReferencesSearchHandler._isFullIndex project, (err, isFullIndex) ->
  36. if err
  37. logger.err {err, projectId}, "error checking whether to do full index"
  38. return callback(err)
  39. bibDocUrls = docIds.map (docId) ->
  40. ReferencesSearchHandler._buildDocUrl projectId, docId
  41. logger.log {projectId, isFullIndex, docIds}, "sending request to references service"
  42. request.post {
  43. url: "#{settings.apis.references.url}/project/#{projectId}/index"
  44. json:
  45. docUrls: bibDocUrls
  46. fullIndex: isFullIndex
  47. }, (err, res, data) ->
  48. if err
  49. logger.err {err, projectId}, "error communicating with references api"
  50. return callback(err)
  51. if 200 <= res.statusCode < 300
  52. logger.log {projectId}, "got keys from references api"
  53. return callback(null, data)
  54. else
  55. err = new Error("references api responded with non-success code: #{res.statusCode}")
  56. logger.log {err, projectId}, "error updating references"
  57. return callback(err)