DocArchiveManager.coffee 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. MongoManager = require "./MongoManager"
  2. Errors = require "./Errors"
  3. logger = require "logger-sharelatex"
  4. _ = require "underscore"
  5. async = require "async"
  6. settings = require("settings-sharelatex")
  7. request = require("request")
  8. crypto = require("crypto")
  9. thirtySeconds = 30 * 1000
  10. module.exports = DocArchive =
  11. archiveAllDocs: (project_id, callback = (error, docs) ->) ->
  12. MongoManager.getProjectsDocs project_id, (error, docs) ->
  13. if err?
  14. return callback(error)
  15. else if !docs?
  16. return callback new Errors.NotFoundError("No docs for project #{project_id}")
  17. jobs = _.map docs, (doc) ->
  18. (cb)-> DocArchive.archiveDoc project_id, doc, cb
  19. async.series jobs, callback
  20. archiveDoc: (project_id, doc, callback)->
  21. logger.log project_id: project_id, doc_id: doc._id, "sending doc to s3"
  22. options = buildS3Options(doc.lines, project_id+"/"+doc._id)
  23. request.put options, (err, res)->
  24. if err? || res.statusCode != 200
  25. logger.err err:err, res:res, "something went wrong archiving doc in aws"
  26. callback(err)
  27. MongoManager.markDocAsArchived doc._id, doc.rev, (error) ->
  28. return callback(error) if error?
  29. callback()
  30. unArchiveAllDocs: (project_id, callback = (error) ->) ->
  31. MongoManager.getArchivedProjectDocs project_id, (error, docs) ->
  32. if err?
  33. return callback(error)
  34. else if !docs?
  35. return callback new Errors.NotFoundError("No docs for project #{project_id}")
  36. jobs = _.map docs, (doc) ->
  37. (cb)->
  38. if !doc.inS3?
  39. return cb()
  40. else
  41. DocArchive.unarchiveDoc project_id, doc._id, cb
  42. async.series jobs, callback
  43. unarchiveDoc: (project_id, doc_id, callback)->
  44. logger.log project_id: project_id, doc_id: doc_id, "getting doc from s3"
  45. options = buildS3Options(true, project_id+"/"+doc_id)
  46. request.get options, (err, res, lines)->
  47. if err? || res.statusCode != 200
  48. logger.err err:err, res:res, "something went wrong unarchiving doc from aws"
  49. callback(err)
  50. MongoManager.upsertIntoDocCollection project_id, doc_id.toString(), lines, (error) ->
  51. return callback(error) if error?
  52. callback()
  53. buildS3Options = (content, key)->
  54. return {
  55. aws:
  56. key: settings.filestore.s3.key
  57. secret: settings.filestore.s3.secret
  58. bucket: settings.filestore.stores.user_files
  59. timeout: thirtySeconds
  60. json: content
  61. #headers:
  62. # 'content-md5': crypto.createHash("md5").update(content).digest("hex")
  63. uri:"https://#{settings.filestore.stores.user_files}.s3.amazonaws.com/#{key}"
  64. }