ReferencesHandler.coffee 3.1 KB

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