ReferencesSearchHandler.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. logger = require("logger-sharelatex")
  2. request = require("request")
  3. settings = require("settings-sharelatex")
  4. ProjectLocator = require("../Project/ProjectLocator")
  5. U = require('underscore')
  6. Async = require('async')
  7. Project = require("../../models/Project").Project
  8. UserGetter = require "../User/UserGetter"
  9. oneMinInMs = 60 * 1000
  10. fiveMinsInMs = oneMinInMs * 5
  11. module.exports = ReferencesSearchHandler =
  12. _findBibDocIds: (project) ->
  13. ids = []
  14. _process = (folder) ->
  15. folder.docs.forEach (doc) ->
  16. if doc?.name?.match(/^.*\.bib$/)
  17. ids.push(doc._id)
  18. folder.folders.forEach (folder) ->
  19. _process(folder)
  20. project.rootFolder.forEach (rootFolder) ->
  21. _process(rootFolder)
  22. return ids
  23. _isFullIndex: (projectId, callback = (err, result) ->) ->
  24. Project.findById projectId, {owner_ref: 1}, (err, project) ->
  25. return callback(err) if err
  26. UserGetter.getUser project.owner_ref, {features: 1}, (err, owner) ->
  27. return callback(err) if err
  28. callback(null, owner.features.references == true)
  29. indexProjectReferences: (project, callback = (err) ->) ->
  30. logger.log {projectId: project._id}, "try indexing references from project"
  31. ids = ReferencesSearchHandler._findBibDocIds(project)
  32. logger.log {projectId: project._id, count: ids.length}, "found bib files in project"
  33. Async.eachSeries(
  34. ids,
  35. (docId, next) ->
  36. ReferencesSearchHandler.indexFile project._id, docId, (err) ->
  37. next(err)
  38. , (err) ->
  39. logger.log {projectId: project._id, count: ids.length}, "done index bib files in project"
  40. callback(err)
  41. )
  42. indexFile: (projectId, fileId, callback = (err)->) ->
  43. target_url = "#{settings.apis.references.url}/project/#{projectId}"
  44. fileUrl = ReferencesSearchHandler._buildDocUrl projectId, fileId
  45. logger.log {projectId, fileId}, "checking if file should be fully indexed"
  46. ReferencesSearchHandler._isFullIndex projectId, (err, isFullIndex) ->
  47. if err
  48. logger.err {projectId, fileId, err}, "error checking if file should be fully indexed"
  49. return callback(err)
  50. logger.log {projectId, fileId, isFullIndex}, "sending index request to references api"
  51. request.post {
  52. url: target_url
  53. json:
  54. referencesUrl: fileUrl
  55. fullIndex: isFullIndex == true
  56. }, (err, res, result) ->
  57. if err
  58. return callback(err)
  59. if 200 <= res.statusCode < 300
  60. return callback(null)
  61. else
  62. err = new Error("references api responded with non-success code: #{res.statusCode}")
  63. logger.log {err, projectId, fileUrl}, "error updating references"
  64. return callback(err)
  65. getKeys: (projectId, callback = (err, result)->) ->
  66. logger.log {projectId}, "getting keys from remote references api"
  67. url = "#{settings.apis.references.url}/project/#{projectId}/keys"
  68. request.get {
  69. url: url
  70. json: true
  71. }, (err, res, result) ->
  72. if err
  73. return callback(err)
  74. if 200 <= res.statusCode < 300
  75. return callback(null, result)
  76. else
  77. err = new Error("references api responded with non-success code: #{res.statusCode}")
  78. logger.log {err, projectId}, "error getting references keys"
  79. return callback(err)
  80. _buildDocUrl: (projectId, docId) ->
  81. "#{settings.apis.web.url}/project/#{projectId}/doc/#{docId}"