VersioningApiHandler.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. settings = require('settings-sharelatex')
  2. logger = require('logger-sharelatex')
  3. Project = require('../../models/Project').Project
  4. request = require('request')
  5. DocumentUpdaterHandler = require('../../Features/DocumentUpdater/DocumentUpdaterHandler')
  6. redis = require('redis')
  7. rclient = redis.createClient(settings.redis.web.port, settings.redis.web.host)
  8. rclient.auth(settings.redis.web.password)
  9. Keys = require("./RedisKeys")
  10. ProjectEntityHandler = require('../../Features/Project/ProjectEntityHandler')
  11. metrics = require('../../infrastructure/Metrics')
  12. keys = require('../../infrastructure/Keys')
  13. queue = require('fairy').connect(settings.redis.fairy).queue(keys.queue.web_to_tpds_http_requests)
  14. slReqIdHelper = require('soa-req-id')
  15. headers =
  16. Authorization : "Basic " + new Buffer("#{settings.apis.versioning.username}:#{settings.apis.versioning.password}").toString("base64")
  17. module.exports =
  18. enableVersioning: (project_or_id, callback = (err)->)->
  19. Project.getProject project_or_id, 'existsInVersioningApi', (error, project)=>
  20. return callback error if error?
  21. return callback new Error("project_id:#{project_id} does not exist") if !project?
  22. project_id = project._id
  23. if project.existsInVersioningApi
  24. logger.log project_id: project_id, "versioning already enabled"
  25. return callback()
  26. logger.log project_id: project_id, "enabling versioning in versioning API"
  27. @createProject project_id, (error) ->
  28. return callback error if error?
  29. logger.log project_id: project_id, "enabling versioning in Mongo"
  30. project.existsInVersioningApi = true
  31. update = existsInVersioningApi : true
  32. conditions = _id:project_id
  33. Project.update conditions, update, {}, ->
  34. ProjectEntityHandler.flushProjectToThirdPartyDataStore project_id, (err) ->
  35. callback(err)
  36. proxyToVersioningApi : (req, res) ->
  37. metrics.inc "versioning.proxy"
  38. options =
  39. url : settings.apis.versioning.url + req.url
  40. headers : headers
  41. logger.log url: req.url, "proxying to versioning api"
  42. getReq = request.get(options)
  43. getReq.pipe(res)
  44. getReq.on "error", (error) ->
  45. logger.error err: error, "versioning API error"
  46. res.send 500
  47. createProject : (project_id, callback) ->
  48. url = "#{settings.apis.versioning.url}/project/#{project_id}"
  49. options = {method:"post", url:url, headers:headers, title:"createVersioningProject"}
  50. queue.enqueue project_id, "standardHttpRequest", options, callback
  51. takeSnapshot: (project_id, message, sl_req_id, callback = (error) ->)->
  52. {callback, sl_req_id} = slReqIdHelper.getCallbackAndReqId(callback, sl_req_id)
  53. logger.log project_id: project_id, sl_req_id: sl_req_id, "taking snapshot of project"
  54. # This isn't critical so we can do it async
  55. rclient.set Keys.buildLastSnapshotKey(project_id), Date.now(), () ->
  56. rclient.srem Keys.projectsToSnapshotKey, project_id, () ->
  57. DocumentUpdaterHandler.flushProjectToMongo project_id, sl_req_id, (err) ->
  58. return callback(err) if err?
  59. url = "#{settings.apis.versioning.url}/project/#{project_id}/version"
  60. json = version:{message:message}
  61. options = {method:"post", json:json, url:url, headers:headers, title:"takeVersioningSnapshot"}
  62. queue.enqueue project_id, "standardHttpRequest", options, ->
  63. logger.log options:options, project_id, "take snapshot enqueued"
  64. callback()