ReferencesHandler.coffee 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. logger = require("logger-sharelatex")
  2. request = require("request")
  3. settings = require("settings-sharelatex")
  4. Project = require("../../models/Project").Project
  5. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  6. U = require('underscore')
  7. Async = require('async')
  8. oneMinInMs = 60 * 1000
  9. fiveMinsInMs = oneMinInMs * 5
  10. module.exports = ReferencesHandler =
  11. _buildDocUrl: (projectId, docId) ->
  12. "#{settings.apis.docstore.url}/project/#{projectId}/doc/#{docId}/raw"
  13. _findBibDocIds: (project) ->
  14. ids = []
  15. _process = (folder) ->
  16. folder.docs.forEach (doc) ->
  17. if doc?.name?.match(/^.*\.bib$/)
  18. ids.push(doc._id)
  19. folder.folders.forEach (folder) ->
  20. _process(folder)
  21. project.rootFolder.forEach (rootFolder) ->
  22. _process(rootFolder)
  23. return ids
  24. _isFullIndex: (project, callback = (err, result) ->) ->
  25. owner = project.owner_ref
  26. callback(null, owner.features.references == true)
  27. indexAll: (projectId, 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. logger.log {projectId}, "indexing all bib files in project"
  33. docIds = ReferencesHandler._findBibDocIds(project)
  34. ReferencesHandler._doIndexOperation(projectId, project, docIds, callback)
  35. index: (projectId, docIds, callback=(err, data)->) ->
  36. Project.findPopulatedById projectId, (err, project) ->
  37. if err
  38. logger.err {err, projectId}, "error finding project"
  39. return callback(err)
  40. ReferencesHandler._doIndexOperation(projectId, project, docIds, callback)
  41. _doIndexOperation: (projectId, project, docIds, callback) ->
  42. ReferencesHandler._isFullIndex project, (err, isFullIndex) ->
  43. if err
  44. logger.err {err, projectId}, "error checking whether to do full index"
  45. return callback(err)
  46. logger.log {projectId, docIds}, 'flushing docs to mongo before calling references service'
  47. Async.series(
  48. docIds.map((docId) -> (cb) -> DocumentUpdaterHandler.flushDocToMongo(projectId, docId, cb)),
  49. (err) ->
  50. # continue
  51. if err
  52. logger.err {err, projectId, docIds}, "error flushing docs to mongo"
  53. return callback(err)
  54. bibDocUrls = docIds.map (docId) ->
  55. ReferencesHandler._buildDocUrl projectId, docId
  56. logger.log {projectId, isFullIndex, docIds, bibDocUrls}, "sending request to references service"
  57. request.post {
  58. url: "#{settings.apis.references.url}/project/#{projectId}/index"
  59. json:
  60. docUrls: bibDocUrls
  61. fullIndex: isFullIndex
  62. }, (err, res, data) ->
  63. if err
  64. logger.err {err, projectId}, "error communicating with references api"
  65. return callback(err)
  66. if 200 <= res.statusCode < 300
  67. logger.log {projectId}, "got keys from references api"
  68. return callback(null, data)
  69. else
  70. err = new Error("references api responded with non-success code: #{res.statusCode}")
  71. logger.log {err, projectId}, "error updating references"
  72. return callback(err)
  73. )