ReferencesHandler.coffee 3.9 KB

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