diff --git a/services/filestore/app/coffee/AWSSDKPersistorManager.coffee b/services/filestore/app/coffee/AWSSDKPersistorManager.coffee new file mode 100644 index 0000000000..808b0b5219 --- /dev/null +++ b/services/filestore/app/coffee/AWSSDKPersistorManager.coffee @@ -0,0 +1,74 @@ +logger = require "logger-sharelatex" +aws = require "aws-sdk" +_ = require "underscore" +fs = require "fs" + +s3 = aws.S3() + +module.exports = + sendFile: (bucketName, key, fsPath, callback)-> + logger.log bucketName:bucketName, key, "send file data to s3" + stream = fs.createReadStream fsPath + s3.putObject Bucket: bucketName, Key: key, Body: stream, (err, data) -> + if err? + logger.err err: err, Bucket: bucketName, Key: key, "error sending file data to s3" + callback err + + sendStream: (bucketName, key, stream, callback)-> + logger.log bucketName:bucketName, key, "send file stream to s3" + s3.putObject Bucket: bucketName, Key: key, Body: stream, (err, data) -> + if err? + logger.err err: err, Bucket: bucketName, Key: key, "error sending file stream to s3" + callback err + + getFileStream: (bucketName, key, callback = (err, res)->)-> + logger.log bucketName:bucketName, key, "get file stream from s3" + callback = _.once callback + stream = s3.getObject(Bucket:bucketName, Key: key).createReadStream() + stream.on 'response', (res) -> + callback null, res + stream.on 'error', (err) -> + logger.err err:err, bucketName:bucketName, key:key, "error getting file stream from s3" + callback err + + copyFile: (bucketName, sourceKey, destKey, callback)-> + logger.log bucketName:bucketName, sourceKey:sourceKey, destKey: destKey, "copying file in s3" + source = bucketName + '/' + sourceKey + s3.copyObject {Bucket: bucketName, Key: destKey, CopySource: source}, (err) -> + if err? + logger.err err:err, bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "something went wrong copying file in s3" + callback err + + deleteFile: (bucketName, key, callback)-> + logger.log bucketName:bucketName, key:key, "delete file in s3" + s3.deleteObject {Bucket: bucketName, Key: key}, (err) -> + if err? + logger.err err:err, bucketName:bucketName, key:key, "something went wrong deleting file in s3" + callback err + + deleteDirectory: (bucketName, key, callback)-> + logger.log bucketName:bucketName, key:key, "delete directory in s3" + s3.listObjects {Bucket: bucketName, prefix: key}, (err, data) -> + if err? + logger.err err:err, bucketName:bucketName, key:key, "something went wrong listing prefix in s3" + return callback err + keys = _.map data.Contents, (entry)-> + Key: entry.Key + s3.deleteMultiple + Bucket: bucketName + Delete: + Objects: keys + Quiet: true + , (err) -> + if err? + logger.err err:err, bucketName:bucketName, key:key, "something went wrong deleting directory in s3" + callback err + + checkIfFileExists:(bucketName, key, callback)-> + logger.log bucketName:bucketName, key:key, "check file existence in s3" + s3.headObject {Bucket: bucketName, Key: key}, (err, data) -> + if err? + logger.err err:err, bucketName:bucketName, key:key, "something went wrong checking head in s3" + return callback err + callback null, data.ETag? + diff --git a/services/filestore/app/coffee/PersistorManager.coffee b/services/filestore/app/coffee/PersistorManager.coffee index 1dad923098..aa5c80599d 100644 --- a/services/filestore/app/coffee/PersistorManager.coffee +++ b/services/filestore/app/coffee/PersistorManager.coffee @@ -7,6 +7,8 @@ settings.filestore.backend ||= "s3" logger.log backend:settings.filestore.backend, "Loading backend" module.exports = switch settings.filestore.backend + when "aws-sdk" + require "./AWSSDKPersistorManager" when "s3" require("./S3PersistorManager") when "fs" diff --git a/services/filestore/package.json b/services/filestore/package.json index dd84289f30..441d4ad7e3 100644 --- a/services/filestore/package.json +++ b/services/filestore/package.json @@ -8,6 +8,7 @@ }, "dependencies": { "async": "~0.2.10", + "aws-sdk": "^2.1.39", "bunyan": "^1.3.5", "coffee-script": "~1.7.1", "express": "~3.4.8",