MongoAWS.coffee 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. settings = require "settings-sharelatex"
  2. logger = require "logger-sharelatex"
  3. AWS = require 'aws-sdk'
  4. S3S = require 's3-streams'
  5. {db, ObjectId} = require "./mongojs"
  6. JSONStream = require "JSONStream"
  7. ReadlineStream = require "readline-stream"
  8. module.exports = MongoAWS =
  9. bulkLimit: 10
  10. archiveDocHistory: (project_id, doc_id, _callback = (error) ->) ->
  11. callback = (args...) ->
  12. _callback(args...)
  13. _callback = () ->
  14. query = {
  15. doc_id: ObjectId(doc_id)
  16. expiresAt: {$exists : false}
  17. }
  18. AWS.config.update {
  19. accessKeyId: settings.filestore.s3.key
  20. secretAccessKey: settings.filestore.s3.secret
  21. }
  22. upload = S3S.WriteStream new AWS.S3(), {
  23. "Bucket": settings.filestore.stores.user_files,
  24. "Key": project_id+"/changes-"+doc_id
  25. }
  26. db.docHistory.find(query)
  27. .on 'error', (err) ->
  28. callback(err)
  29. .pipe JSONStream.stringify()
  30. .pipe upload
  31. .on 'error', (err) ->
  32. callback(err)
  33. .on 'finish', () ->
  34. return callback(null)
  35. unArchiveDocHistory: (project_id, doc_id, _callback = (error) ->) ->
  36. callback = (args...) ->
  37. _callback(args...)
  38. _callback = () ->
  39. AWS.config.update {
  40. accessKeyId: settings.filestore.s3.key
  41. secretAccessKey: settings.filestore.s3.secret
  42. }
  43. download = S3S.ReadStream new AWS.S3(), {
  44. "Bucket": settings.filestore.stores.user_files,
  45. "Key": project_id+"/changes-"+doc_id
  46. }, {
  47. encoding: "utf8"
  48. }
  49. lineStream = new ReadlineStream();
  50. ops = []
  51. download
  52. .on 'open', (obj) ->
  53. return 1
  54. .on 'error', (err) ->
  55. callback(err)
  56. .pipe lineStream
  57. .on 'data', (line) ->
  58. if line.length > 2
  59. ops.push(JSON.parse(line))
  60. if ops.length == MongoAWS.bulkLimit
  61. download.pause()
  62. MongoAWS.handleBulk ops.slice(0), () ->
  63. download.resume()
  64. ops.splice(0,ops.length)
  65. .on 'end', () ->
  66. MongoAWS.handleBulk ops, callback
  67. .on 'error', (err) ->
  68. return callback(err)
  69. handleBulk: (ops, cb) ->
  70. bulk = db.docHistory.initializeUnorderedBulkOp();
  71. for op in ops
  72. op._id = ObjectId(op._id)
  73. op.doc_id = ObjectId(op.doc_id)
  74. op.project_id = ObjectId(op.project_id)
  75. bulk.find({_id:op._id}).upsert().updateOne(op)
  76. if ops.length > 0
  77. bulk.execute (err, result) ->
  78. if err?
  79. logger.error err:err, "error bulking ReadlineStream"
  80. else
  81. logger.log count:ops.length, result:result, "bulked ReadlineStream"
  82. cb(err)
  83. else
  84. cb()