|
@@ -0,0 +1,69 @@
|
|
|
|
|
+settings = require "settings-sharelatex"
|
|
|
|
|
+child_process = require "child_process"
|
|
|
|
|
+mongoUri = require "mongo-uri";
|
|
|
|
|
+logger = require "logger-sharelatex"
|
|
|
|
|
+AWS = require 'aws-sdk'
|
|
|
|
|
+fs = require 'fs'
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+module.exports = MongoAWS =
|
|
|
|
|
+
|
|
|
|
|
+ archiveDocHistory: (project_id, doc_id, callback = (error) ->) ->
|
|
|
|
|
+ MongoAWS.mongoDumpDocHistory doc_id, (error,filepath) ->
|
|
|
|
|
+ MongoAWS.s3upload project_id, doc_id, filepath, callback
|
|
|
|
|
+
|
|
|
|
|
+ mongoDumpDocHistory: (doc_id, callback = (error, filepath) ->) ->
|
|
|
|
|
+ uriData = mongoUri.parse(settings.mongo.url);
|
|
|
|
|
+ filepath = settings.path.dumpFolder + '/' + doc_id + '.json'
|
|
|
|
|
+
|
|
|
|
|
+ args = []
|
|
|
|
|
+ args.push '-h'
|
|
|
|
|
+ args.push uriData.hosts[0]
|
|
|
|
|
+ args.push '-d'
|
|
|
|
|
+ args.push uriData.database
|
|
|
|
|
+ args.push '-c'
|
|
|
|
|
+ args.push 'docHistory'
|
|
|
|
|
+ args.push '-q'
|
|
|
|
|
+ args.push "{doc_id: ObjectId('#{doc_id}') }"
|
|
|
|
|
+ args.push '-o'
|
|
|
|
|
+ args.push filepath
|
|
|
|
|
+
|
|
|
|
|
+ proc = child_process.spawn "mongoexport", args
|
|
|
|
|
+
|
|
|
|
|
+ proc.on "error", callback
|
|
|
|
|
+
|
|
|
|
|
+ stderr = ""
|
|
|
|
|
+ proc.stderr.on "data", (chunk) -> stderr += chunk.toString()
|
|
|
|
|
+
|
|
|
|
|
+ proc.on "close", (code) ->
|
|
|
|
|
+ if code == 0
|
|
|
|
|
+ return callback(null,filepath)
|
|
|
|
|
+ else
|
|
|
|
|
+ return callback(new Error("mongodump failed: #{stderr}"),null)
|
|
|
|
|
+
|
|
|
|
|
+ s3upload: (project_id, doc_id, filepath, callback = (error) ->) ->
|
|
|
|
|
+
|
|
|
|
|
+ AWS.config.update {
|
|
|
|
|
+ accessKeyId: settings.filestore.s3.key
|
|
|
|
|
+ secretAccessKey: settings.filestore.s3.secret
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ s3Stream = require('s3-upload-stream')(new AWS.S3());
|
|
|
|
|
+
|
|
|
|
|
+ upload = s3Stream.upload {
|
|
|
|
|
+ "Bucket": settings.filestore.stores.user_files,
|
|
|
|
|
+ "Key": project_id+"/changes-"+doc_id
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ read = fs.createReadStream filepath
|
|
|
|
|
+
|
|
|
|
|
+ #Handle errors.
|
|
|
|
|
+ upload.on 'error', callback
|
|
|
|
|
+
|
|
|
|
|
+ #Handle upload completion.
|
|
|
|
|
+ upload.on 'uploaded', (details) ->
|
|
|
|
|
+ return callback(null)
|
|
|
|
|
+
|
|
|
|
|
+ #Pipe the incoming filestream and up to S3.
|
|
|
|
|
+ read.pipe(upload);
|
|
|
|
|
+
|