AWS
Install
yarn add aws-sdk
Setup
import {
AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY,
AWS_REGION,
AWS_PINPOINT_ID,
PROJECT_MODE
} from '@/constants/config.constant';
import { renderTemplate } from '../utils/layout.util';
AWS.config.update({
accessKeyId: AWS_ACCESS_KEY_ID,
secretAccessKey: AWS_SECRET_ACCESS_KEY,
region: AWS_REGION
});
const aws_s3 = new AWS.S3();
const pinpoint = new AWS.Pinpoint({ apiVersion: '2016-12-01' });
s3
const s3Upload = async (config = {}, files) => {
try {
console.log('s3 upload', { config });
let result = [];
if (files && files instanceof Array) {
let promises = [];
for (const file of files) {
promises.push(
aws_s3
.upload({
Bucket: config.bucket,
Body: file.data,
Key: `${PROJECT_MODE}${config.path}${file.md5}_${file.name}`
})
.promise()
);
}
const values = await Promise.all(promises);
values.map((x) => {
result.push({
url: x.Location,
...config
});
});
}
console.log({ result });
return result;
} catch (err) {
console.log({ s3UploadError: err });
}
};
const s3Delete = async (deletion) => {
try {
console.log('s3 delete', { deletion });
let result = [];
// Always receive Array, even for 1 element
if (deletion && deletion instanceof Array) {
let promises = [];
for (const element of deletion) {
promises.push(
aws_s3
.deleteObject({
Bucket: element.bucket,
Key: element.key
})
.promise()
);
}
await Promise.all(promises);
}
result = deletion.map((x) => x.key);
console.log(result);
return result;
} catch (err) {
console.log({ s3DeleteError: err });
}
};
Pinpoint
const sendEmail = async (data) => {
try {
console.log('📧 email', data);
if (PROJECT_MODE !== 'development') {
const parts = {};
// simple email
if (data.message)
parts.TextPart = {
Charset: 'UTF-8',
Data: data.message
};
// html email
if (data.template)
parts.HtmlPart = {
Charset: 'UTF-8',
Data: await renderTemplate(data.template, data.params)
};
const params = {
ApplicationId: AWS_PINPOINT_ID,
MessageRequest: {
Addresses: {
[data.to]: {
ChannelType: 'EMAIL'
}
},
MessageConfiguration: {
EmailMessage: {
FromAddress: data.from,
SimpleEmail: {
Subject: {
Charset: 'UTF-8',
Data: data.subject
},
...parts
}
}
}
}
};
const result = await pinpoint.sendMessages(params).promise();
console.log({ result });
console.log({ detail: result.MessageResponse.Result });
}
} catch (err) {
console.log({ sendEmailError: err });
}
};
const sendSMS = async (data) => {
try {
console.log('📱 sms', data);
if (PROJECT_MODE !== 'development') {
const params = {
ApplicationId: AWS_PINPOINT_ID,
MessageRequest: {
Addresses: {
[data.to]: {
BodyOverride: data.message,
ChannelType: 'SMS'
}
},
MessageConfiguration: {
SMSMessage: {
Body: data.message,
MessageType: 'TRANSACTIONAL'
}
}
}
};
const result = await pinpoint.sendMessages(params).promise();
console.log({ result });
}
} catch (err) {
console.log({ sendSMSError: err });
}
};
TEST
// Test S3 upload
s3Upload(
{
bucket: 'Nodetomic',
path: `development/images/user1/`
},
files
);
// Test S3 delete
s3Delete([
{
bucket: 'Nodetomic',
key: `development/images/xxxxx.jpg`
}
]);
// Test SMS
sendSMS({
to: '+573001111111',
from: 'Nodetomic',
message: 'Nodetomic: 123'
});
// Test Email
sendEmail({
to: 'user@example.com',
from: 'hi@example.com',
subject: 'Nodetomic',
message: 'This is a test',
template: 'email.register',
params: {
code: 123
}
});