Unverified Commit 9b0a5ff0 authored by John Crepezzi's avatar John Crepezzi Committed by GitHub
Browse files

Merge pull request #291 from j3parker/s3-document-store

Add an Amazon S3 document store
parents b866c33c 1fff4856
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -198,6 +198,44 @@ Also, you must create an `uploads` table, which will store all the data for uplo

You can optionally add the `user` and `password` properties to use a user system.

### Amazon S3

To use [Amazon S3](https://aws.amazon.com/s3/) as a storage system, you must
install the `aws-sdk` package via npm:

`npm install aws-sdk`

Once you've done that, your config section should look like this:

```json
{
  "type": "amazon-s3",
  "bucket": "your-bucket-name",
  "region": "us-east-1"
}
```

Authentication is handled automatically by the client. Check
[Amazon's documentation](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html)
for more information. You will need to grant your role these permissions to
your bucket:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::your-bucket-name-goes-here/*"
        }
    ]
}
```

## Author

John Crepezzi <john.crepezzi@gmail.com>
+56 −0
Original line number Diff line number Diff line
/*global require,module,process*/

var AWS = require('aws-sdk');
var winston = require('winston');

var AmazonS3DocumentStore = function(options) {
  this.expire = options.expire;
  this.bucket = options.bucket;
  this.client = new AWS.S3({region: options.region});
};

AmazonS3DocumentStore.prototype.get = function(key, callback, skipExpire) {
  var _this = this;

  var req = {
    Bucket: _this.bucket,
    Key: key
  };

  _this.client.getObject(req, function(err, data) {
    if(err) {
      callback(false);
    }
    else {
      callback(data.Body.toString('utf-8'));
      if (_this.expire && !skipExpire) {
        winston.warn('amazon s3 store cannot set expirations on keys');
      }
    }
  });
}

AmazonS3DocumentStore.prototype.set = function(key, data, callback, skipExpire) {
  var _this = this;

  var req = {
    Bucket: _this.bucket,
    Key: key,
    Body: data,
    ContentType: 'text/plain'
  };

  _this.client.putObject(req, function(err, data) {
    if (err) {
      callback(false);
    }
    else {
      callback(true);
      if (_this.expire && !skipExpire) {
        winston.warn('amazon s3 store cannot set expirations on keys');
      }
    }
  });
}

module.exports = AmazonS3DocumentStore;