ReferencesSearchHandler.coffee 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. logger = require("logger-sharelatex")
  2. request = require("request")
  3. settings = require("settings-sharelatex")
  4. ProjectLocator = require("../Project/ProjectLocator")
  5. U = require('underscore')
  6. Async = require('async')
  7. oneMinInMs = 60 * 1000
  8. fiveMinsInMs = oneMinInMs * 5
  9. module.exports = ReferencesSearchHandler =
  10. _findBibDocIds: (project) ->
  11. ids = []
  12. _process = (folder) ->
  13. folder.docs.forEach (doc) ->
  14. if doc?.name?.match(/^.*\.bib$/)
  15. ids.push(doc._id)
  16. folder.folders.forEach (folder) ->
  17. _process(folder)
  18. project.rootFolder.forEach (rootFolder) ->
  19. _process(rootFolder)
  20. return ids
  21. indexProjectReferences: (project, callback = (err) ->) ->
  22. logger.log {projectId: project._id}, "try indexing references from project"
  23. ids = ReferencesSearchHandler._findBibDocIds(project)
  24. logger.log {projectId: project._id, count: ids.length}, "found bib files in project"
  25. Async.eachSeries(
  26. ids,
  27. (docId, next) ->
  28. ReferencesSearchHandler.indexFile project._id, docId, (err) ->
  29. next(err)
  30. , (err) ->
  31. logger.log {projectId: project._id, count: ids.length}, "done index bib files in project"
  32. callback(err)
  33. )
  34. indexFile: (project_id, file_id, callback = (err)->) ->
  35. logger.log {project_id, file_id}, "sending index request to references api"
  36. target_url = "#{settings.apis.references.url}/project/#{project_id}"
  37. file_url = ReferencesSearchHandler._buildDocUrl project_id, file_id
  38. request.post {
  39. url: target_url
  40. json:
  41. referencesUrl: file_url
  42. }, (err, res, result) ->
  43. if err
  44. return callback(err)
  45. if 200 <= res.statusCode < 300
  46. return callback(null)
  47. else
  48. err = new Error("references api responded with non-success code: #{res.statusCode}")
  49. logger.log {err, project_id, file_url}, "error updating references"
  50. return callback(err)
  51. getKeys: (project_id, callback = (err, result)->) ->
  52. logger.log {project_id}, "getting keys from remote references api"
  53. url = "#{settings.apis.references.url}/project/#{project_id}/keys"
  54. request.get {
  55. url: url
  56. json: true
  57. }, (err, res, result) ->
  58. if err
  59. return callback(err)
  60. if 200 <= res.statusCode < 300
  61. return callback(null, result)
  62. else
  63. err = new Error("references api responded with non-success code: #{res.statusCode}")
  64. logger.log {err, project_id}, "error getting references keys"
  65. return callback(err)
  66. _buildDocUrl: (project_id, doc_id) ->
  67. "#{settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}"