ReferencesHandler.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. _ = require('underscore')
  8. Async = require('async')
  9. oneMinInMs = 60 * 1000
  10. fiveMinsInMs = oneMinInMs * 5
  11. if !settings.apis?.references?.url?
  12. logger.log "references search not enabled"
  13. module.exports = ReferencesHandler =
  14. _buildDocUrl: (projectId, docId) ->
  15. "#{settings.apis.docstore.url}/project/#{projectId}/doc/#{docId}/raw"
  16. _buildFileUrl: (projectId, fileId) ->
  17. "#{settings.apis.filestore.url}/project/#{projectId}/file/#{fileId}"
  18. _findBibFileIds: (project) ->
  19. ids = []
  20. _process = (folder) ->
  21. _.each (folder.fileRefs or []), (file) ->
  22. if file?.name?.match(/^.*\.bib$/)
  23. ids.push(file._id)
  24. _.each (folder.folders or []), (folder) ->
  25. _process(folder)
  26. _.each (project.rootFolder or []), (rootFolder) ->
  27. _process(rootFolder)
  28. return ids
  29. _findBibDocIds: (project) ->
  30. ids = []
  31. _process = (folder) ->
  32. _.each (folder.docs or []), (doc) ->
  33. if doc?.name?.match(/^.*\.bib$/)
  34. ids.push(doc._id)
  35. _.each (folder.folders or []), (folder) ->
  36. _process(folder)
  37. _.each (project.rootFolder or []), (rootFolder) ->
  38. _process(rootFolder)
  39. return ids
  40. _isFullIndex: (project, callback = (err, result) ->) ->
  41. UserGetter.getUser project.owner_ref, { features: true }, (err, owner) ->
  42. return callback(err) if err?
  43. features = owner?.features
  44. callback(null, features?.references == true || features?.referencesSearch == true)
  45. indexAll: (projectId, callback=(err, data)->) ->
  46. ProjectGetter.getProject projectId, {rootFolder: true, owner_ref: 1}, (err, project) ->
  47. if err
  48. logger.err {err, projectId}, "error finding project"
  49. return callback(err)
  50. logger.log {projectId}, "indexing all bib files in project"
  51. docIds = ReferencesHandler._findBibDocIds(project)
  52. fileIds = ReferencesHandler._findBibFileIds(project)
  53. ReferencesHandler._doIndexOperation(projectId, project, docIds, fileIds, callback)
  54. index: (projectId, docIds, callback=(err, data)->) ->
  55. ProjectGetter.getProject projectId, {rootFolder: true, owner_ref: 1}, (err, project) ->
  56. if err
  57. logger.err {err, projectId}, "error finding project"
  58. return callback(err)
  59. ReferencesHandler._doIndexOperation(projectId, project, docIds, [], callback)
  60. _doIndexOperation: (projectId, project, docIds, fileIds, callback) ->
  61. if !settings.apis?.references?.url?
  62. return callback()
  63. ReferencesHandler._isFullIndex project, (err, isFullIndex) ->
  64. if err
  65. logger.err {err, projectId}, "error checking whether to do full index"
  66. return callback(err)
  67. logger.log {projectId, docIds}, 'flushing docs to mongo before calling references service'
  68. Async.series(
  69. docIds.map((docId) -> (cb) -> DocumentUpdaterHandler.flushDocToMongo(projectId, docId, cb)),
  70. (err) ->
  71. # continue
  72. if err
  73. logger.err {err, projectId, docIds}, "error flushing docs to mongo"
  74. return callback(err)
  75. bibDocUrls = docIds.map (docId) ->
  76. ReferencesHandler._buildDocUrl projectId, docId
  77. bibFileUrls = fileIds.map (fileId) ->
  78. ReferencesHandler._buildFileUrl projectId, fileId
  79. allUrls = bibDocUrls.concat(bibFileUrls)
  80. logger.log {projectId, isFullIndex, docIds, bibDocUrls}, "sending request to references service"
  81. request.post {
  82. url: "#{settings.apis.references.url}/project/#{projectId}/index"
  83. json:
  84. docUrls: allUrls
  85. fullIndex: isFullIndex
  86. }, (err, res, data) ->
  87. if err
  88. logger.err {err, projectId}, "error communicating with references api"
  89. return callback(err)
  90. if 200 <= res.statusCode < 300
  91. logger.log {projectId}, "got keys from references api"
  92. return callback(null, data)
  93. else
  94. err = new Error("references api responded with non-success code: #{res.statusCode}")
  95. logger.log {err, projectId}, "error updating references"
  96. return callback(err)
  97. )