ReferencesHandler.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. callback(null, owner?.features?.references == true)
  42. indexAll: (projectId, callback=(err, data)->) ->
  43. ProjectGetter.getProject projectId, {rootFolder: true, owner_ref: 1}, (err, project) ->
  44. if err
  45. logger.err {err, projectId}, "error finding project"
  46. return callback(err)
  47. logger.log {projectId}, "indexing all bib files in project"
  48. docIds = ReferencesHandler._findBibDocIds(project)
  49. fileIds = ReferencesHandler._findBibFileIds(project)
  50. ReferencesHandler._doIndexOperation(projectId, project, docIds, fileIds, callback)
  51. index: (projectId, docIds, callback=(err, data)->) ->
  52. ProjectGetter.getProject projectId, {rootFolder: true, owner_ref: 1}, (err, project) ->
  53. if err
  54. logger.err {err, projectId}, "error finding project"
  55. return callback(err)
  56. ReferencesHandler._doIndexOperation(projectId, project, docIds, [], callback)
  57. _doIndexOperation: (projectId, project, docIds, fileIds, callback) ->
  58. if !settings.apis?.references?.url?
  59. return callback()
  60. ReferencesHandler._isFullIndex project, (err, isFullIndex) ->
  61. if err
  62. logger.err {err, projectId}, "error checking whether to do full index"
  63. return callback(err)
  64. logger.log {projectId, docIds}, 'flushing docs to mongo before calling references service'
  65. Async.series(
  66. docIds.map((docId) -> (cb) -> DocumentUpdaterHandler.flushDocToMongo(projectId, docId, cb)),
  67. (err) ->
  68. # continue
  69. if err
  70. logger.err {err, projectId, docIds}, "error flushing docs to mongo"
  71. return callback(err)
  72. bibDocUrls = docIds.map (docId) ->
  73. ReferencesHandler._buildDocUrl projectId, docId
  74. bibFileUrls = fileIds.map (fileId) ->
  75. ReferencesHandler._buildFileUrl projectId, fileId
  76. allUrls = bibDocUrls.concat(bibFileUrls)
  77. logger.log {projectId, isFullIndex, docIds, bibDocUrls}, "sending request to references service"
  78. request.post {
  79. url: "#{settings.apis.references.url}/project/#{projectId}/index"
  80. json:
  81. docUrls: allUrls
  82. fullIndex: isFullIndex
  83. }, (err, res, data) ->
  84. if err
  85. logger.err {err, projectId}, "error communicating with references api"
  86. return callback(err)
  87. if 200 <= res.statusCode < 300
  88. logger.log {projectId}, "got keys from references api"
  89. return callback(null, data)
  90. else
  91. err = new Error("references api responded with non-success code: #{res.statusCode}")
  92. logger.log {err, projectId}, "error updating references"
  93. return callback(err)
  94. )