TrackChangesClient.coffee 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. async = require 'async'
  2. zlib = require 'zlib'
  3. request = require "request"
  4. rclient = require("redis").createClient() # Only works locally for now
  5. {db, ObjectId} = require "../../../../app/js/mongojs"
  6. Settings = require "settings-sharelatex"
  7. module.exports = TrackChangesClient =
  8. flushAndGetCompressedUpdates: (project_id, doc_id, callback = (error, updates) ->) ->
  9. TrackChangesClient.flushDoc project_id, doc_id, (error) ->
  10. return callback(error) if error?
  11. TrackChangesClient.getCompressedUpdates doc_id, callback
  12. flushDoc: (project_id, doc_id, callback = (error) ->) ->
  13. request.post {
  14. url: "http://localhost:3015/project/#{project_id}/doc/#{doc_id}/flush"
  15. }, (error, response, body) =>
  16. response.statusCode.should.equal 204
  17. callback(error)
  18. flushProject: (project_id, callback = (error) ->) ->
  19. request.post {
  20. url: "http://localhost:3015/project/#{project_id}/flush"
  21. }, (error, response, body) =>
  22. response.statusCode.should.equal 204
  23. callback(error)
  24. getCompressedUpdates: (doc_id, callback = (error, updates) ->) ->
  25. db.docHistory
  26. .find(doc_id: ObjectId(doc_id))
  27. .sort("meta.end_ts": 1)
  28. .toArray callback
  29. getProjectMetaData: (project_id, callback = (error, updates) ->) ->
  30. db.projectHistoryMetaData
  31. .find {
  32. project_id: ObjectId(project_id)
  33. },
  34. (error, projects) ->
  35. callback error, projects[0]
  36. setPreserveHistoryForProject: (project_id, callback = (error) ->) ->
  37. db.projectHistoryMetaData.update {
  38. project_id: ObjectId(project_id)
  39. }, {
  40. $set: { preserveHistory: true }
  41. }, {
  42. upsert: true
  43. }, callback
  44. pushRawUpdates: (project_id, doc_id, updates, callback = (error) ->) ->
  45. rclient.sadd "DocsWithHistoryOps:#{project_id}", doc_id, (error) ->
  46. return callback(error) if error?
  47. rclient.rpush "UncompressedHistoryOps:#{doc_id}", (JSON.stringify(u) for u in updates)..., callback
  48. getDiff: (project_id, doc_id, from, to, callback = (error, diff) ->) ->
  49. request.get {
  50. url: "http://localhost:3015/project/#{project_id}/doc/#{doc_id}/diff?from=#{from}&to=#{to}"
  51. }, (error, response, body) =>
  52. response.statusCode.should.equal 200
  53. callback null, JSON.parse(body)
  54. getUpdates: (project_id, options, callback = (error, body) ->) ->
  55. request.get {
  56. url: "http://localhost:3015/project/#{project_id}/updates?before=#{options.before}&min_count=#{options.min_count}"
  57. }, (error, response, body) =>
  58. response.statusCode.should.equal 200
  59. callback null, JSON.parse(body)
  60. restoreDoc: (project_id, doc_id, version, user_id, callback = (error) ->) ->
  61. request.post {
  62. url: "http://localhost:3015/project/#{project_id}/doc/#{doc_id}/version/#{version}/restore"
  63. headers:
  64. "X-User-Id": user_id
  65. }, (error, response, body) =>
  66. response.statusCode.should.equal 204
  67. callback null
  68. pushDocHistory: (project_id, doc_id, callback = (error) ->) ->
  69. request.post {
  70. url: "http://localhost:3015/project/#{project_id}/doc/#{doc_id}/push"
  71. }, (error, response, body) =>
  72. response.statusCode.should.equal 204
  73. callback(error)
  74. pullDocHistory: (project_id, doc_id, callback = (error) ->) ->
  75. request.post {
  76. url: "http://localhost:3015/project/#{project_id}/doc/#{doc_id}/pull"
  77. }, (error, response, body) =>
  78. response.statusCode.should.equal 204
  79. callback(error)
  80. buildS3Options: (content, key)->
  81. return {
  82. aws:
  83. key: Settings.trackchanges.s3.key
  84. secret: Settings.trackchanges.s3.secret
  85. bucket: Settings.trackchanges.stores.doc_history
  86. timeout: 30 * 1000
  87. json: content
  88. uri:"https://#{Settings.trackchanges.stores.doc_history}.s3.amazonaws.com/#{key}"
  89. }
  90. getS3Doc: (project_id, doc_id, pack_id, callback = (error, body) ->) ->
  91. options = TrackChangesClient.buildS3Options(true, project_id+"/changes-"+doc_id+"/pack-"+pack_id)
  92. options.encoding = null
  93. request.get options, (err, res, body) ->
  94. return callback(error) if error?
  95. zlib.gunzip body, (err, result) ->
  96. return callback(err) if err?
  97. callback(null, JSON.parse(result.toString()))
  98. removeS3Doc: (project_id, doc_id, callback = (error, res, body) ->) ->
  99. options = TrackChangesClient.buildS3Options(true, "?prefix=" + project_id + "/changes-" +doc_id)
  100. request.get options, (error, res, body) ->
  101. keys = body.match /[0-9a-f]{24}\/changes-[0-9a-f]{24}\/pack-[0-9a-f]{24}/g
  102. async.eachSeries keys, (key, cb) ->
  103. options = TrackChangesClient.buildS3Options(true, key)
  104. request.del options, cb
  105. , callback