ReferencesSearchHandler.coffee 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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: (project, callback = (err, result) ->) ->
  24. owner = project.owner_ref
  25. callback(null, owner.features.references == true)
  26. # projectId: String, docIds: List[String]|Null
  27. index: (projectId, docIds, callback=(err, data)->) ->
  28. Project.findPopulatedById projectId, (err, project) ->
  29. if err
  30. logger.err {err, projectId}, "error finding project"
  31. return callback(err)
  32. if docIds == "ALL"
  33. logger.log {projectId}, "indexing all bib files in project"
  34. docIds = ReferencesSearchHandler._findBibDocIds(project)
  35. ReferencesSearchHandler._isFullIndex project, (err, isFullIndex) ->
  36. if err
  37. logger.err {err, projectId}, "error checking whether to do full index"
  38. return callback(err)
  39. bibDocUrls = docIds.map (docId) ->
  40. ReferencesSearchHandler._buildDocUrl projectId, docId
  41. logger.log {projectId, isFullIndex, docIds}, "sending request to references service"
  42. request.post {
  43. url: "#{settings.apis.references.url}/project/#{projectId}/index"
  44. json:
  45. docUrls: bibDocUrls
  46. fullIndex: isFullIndex
  47. }, (err, res, data) ->
  48. if err
  49. logger.err {err, projectId}, "error communicating with references api"
  50. return callback(err)
  51. if 200 <= res.statusCode < 300
  52. logger.log {projectId}, "got keys from references api"
  53. return callback(null, data)
  54. else
  55. err = new Error("references api responded with non-success code: #{res.statusCode}")
  56. logger.log {err, projectId}, "error updating references"
  57. return callback(err)
  58. ## ## ## ##
  59. # indexProjectReferences: (project, callback = (err) ->) ->
  60. # logger.log {projectId: project._id}, "try indexing references from project"
  61. # ids = ReferencesSearchHandler._findBibDocIds(project)
  62. # logger.log {projectId: project._id, count: ids.length}, "found bib files in project"
  63. # Async.eachSeries(
  64. # ids,
  65. # (docId, next) ->
  66. # ReferencesSearchHandler.indexFile project._id, docId, (err) ->
  67. # next(err)
  68. # , (err) ->
  69. # logger.log {projectId: project._id, count: ids.length}, "done index bib files in project"
  70. # callback(err)
  71. # )
  72. # indexFile: (projectId, fileId, callback = (err)->) ->
  73. # target_url = "#{settings.apis.references.url}/project/#{projectId}"
  74. # fileUrl = ReferencesSearchHandler._buildDocUrl projectId, fileId
  75. # logger.log {projectId, fileId}, "checking if file should be fully indexed"
  76. # ReferencesSearchHandler._isFullIndex projectId, (err, isFullIndex) ->
  77. # if err
  78. # logger.err {projectId, fileId, err}, "error checking if file should be fully indexed"
  79. # return callback(err)
  80. # logger.log {projectId, fileId, isFullIndex}, "sending index request to references api"
  81. # request.post {
  82. # url: target_url
  83. # json:
  84. # referencesUrl: fileUrl
  85. # }, (err, res, result) ->
  86. # if err
  87. # return callback(err)
  88. # if 200 <= res.statusCode < 300
  89. # return callback(null)
  90. # else
  91. # err = new Error("references api responded with non-success code: #{res.statusCode}")
  92. # logger.log {err, projectId, fileUrl}, "error updating references"
  93. # return callback(err)
  94. # getKeys: (projectId, callback = (err, result)->) ->
  95. # logger.log {projectId}, "getting keys from remote references api"
  96. # url = "#{settings.apis.references.url}/project/#{projectId}/keys"
  97. # request.get {
  98. # url: url
  99. # json: true
  100. # }, (err, res, result) ->
  101. # if err
  102. # return callback(err)
  103. # if 200 <= res.statusCode < 300
  104. # return callback(null, result)
  105. # else
  106. # err = new Error("references api responded with non-success code: #{res.statusCode}")
  107. # logger.log {err, projectId}, "error getting references keys"
  108. # return callback(err)
  109. # _buildDocUrl: (projectId, docId) ->
  110. # "#{settings.apis.web.url}/project/#{projectId}/doc/#{docId}"