Files
internship_node/day11/services/S3Service.js
T
ryanwong a07577bffa day 11
2022-02-06 22:15:10 -05:00

157 lines
4.4 KiB
JavaScript
Executable File

require('dotenv').config();
const AWS = require('aws-sdk');
process.env.DYNAMIC_CONFIG_AWS_REGION = 'ap-south-1';
process.env.DYNAMIC_CONFIG_AWS_KEY = 'AKIA5RTSM74BBOL52JEA';
process.env.DYNAMIC_CONFIG_AWS_SECRET =
'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';
process.env.DYNAMIC_CONFIG_AWS_BUCKET = 'sentry-test90426-dev';
class S3Service {
/**
* Initialize S3 service
* @param {bucket} bucket override default aws bucket name
*/
constructor(bucket) {
AWS.config.update({
accessKeyId: process.env.DYNAMIC_CONFIG_AWS_KEY,
secretAccessKey: process.env.DYNAMIC_CONFIG_AWS_SECRET,
region: process.env.DYNAMIC_CONFIG_AWS_REGION,
signatureVersion: 'v4',
});
this.S3 = new AWS.S3();
this.bucket = bucket || process.env.DYNAMIC_CONFIG_AWS_BUCKET;
}
/**
* Upload an object to bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property s3.upload}
* @param {string} key object key
* @param {any} body object body
* @param {AWS.S3.PutObjectRequest} options upload object params
* @returns {Promise.<AWS.S3.Types.ManagedUpload.SendData>}
* @throws {Error}
*/
upload(key, body, options) {
const params = {
Bucket: this.bucket,
Key: key,
Body: body,
...options,
};
return new Promise((resolve, reject) => {
this.S3.upload(params, function (error, data) {
if (error) reject(error);
else resolve(data);
});
});
}
/**
* Upload objects to bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property s3.upload}
* @param {[{key: string, body: any}]} objects objects key and body
* @param {AWS.S3.PutObjectRequest} options upload objects params
* @returns {Promise.<[AWS.S3.Types.ManagedUpload.SendData]>}
* @throws {Error}
*/
batchUpload(objects, options) {
const uploads = [];
objects.forEach((object) => {
const singleUpload = this.upload(object.key, object.body, options);
uploads.push(singleUpload);
});
return Promise.all(uploads);
}
/**
* Get object from bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property s3.getObject}
* @param {string} key object key
* @param {AWS.S3.GetObjectRequest} options get object params
* @returns {Promise.<AWS.S3.Types.GetObjectOutput>}
* @throws {AWS.S3.Error}
*/
get(key, options) {
const params = {
Bucket: this.bucket,
Key: key,
...options,
};
return new Promise((resolve, reject) => {
this.S3.getObject(params, function (error, data) {
if (error) reject(error);
else resolve(data);
});
});
}
/**
* Get objects from bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property s3.getObject}
* @param {[key: string]} keys object keys
* @param {AWS.S3.GetObjectRequest} options get objects params
* @returns {Promise.<[AWS.S3.Types.GetObjectOutput]>}
* @throws {AWS.S3.Error}
*/
batchGet(keys, options) {
const gets = [];
keys.forEach((key) => {
const singleGet = this.get(key, options);
gets.push(singleGet);
});
return Promise.all(gets);
}
/**
* Delete object from bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObject-property s3.getObject}
* @param {string} key object key
* @param {AWS.S3.DeleteObjectRequest} options delete object params
* @returns {Promise.<AWS.S3.Types.DeleteObjectOutput>}
* @throws {AWS.S3.Error}
*/
delete(key, options) {
const params = {
Bucket: this.bucket,
Key: key,
...options,
};
return new Promise((resolve, reject) => {
this.S3.deleteObject(params, function (error, data) {
if (error) reject(error);
else resolve(data);
});
});
}
/**
* Delete objects from bucket
* {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObjects-property s3.getObjects}
* @param {[string]} key objects key
* @param {AWS.S3.DeleteObjectRequest} options delete objects params
* @returns {Promise.<[AWS.S3.Types.DeleteObjectOutput]>}
* @throws {AWS.S3.Error}
*/
batchDelete(keys, options) {
const deletes = [];
keys.forEach((key) => {
const singleDelete = this.delete(key, options);
deletes.push(singleDelete);
});
return Promise.all(deletes);
}
}
module.exports = S3Service;