Skip to content

Instantly share code, notes, and snippets.

@harlesbayu
Created August 29, 2020 08:23
Show Gist options
  • Save harlesbayu/cffebf4a1f4c3a339eabd4f180ff58d8 to your computer and use it in GitHub Desktop.
Save harlesbayu/cffebf4a1f4c3a339eabd4f180ff58d8 to your computer and use it in GitHub Desktop.
/* global Helpers HttpStatus */
const AWS = require('aws-sdk');
const Busboy = require('busboy');
const firebaseAdmin = require('firebase-admin')
const moment = require('moment');
const config = require('../../../config');
const s3 = new AWS.S3({
accessKeyId: config.get('AWS_CREDENTIAL').ACCESS_KEY_ID,
secretAccessKey: config.get('AWS_CREDENTIAL').SECRET_ACCESS_KEY
});
// firebase
let serviceAccount = require('../../credential/firebaseCredential.json');
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(serviceAccount),
databaseURL: config.get('FIREBASE_URL_DEV_PROGRESS_UPLOAD')
})
const uploadController = async (req, res) => {
try {
req.checkHeaders({
requestId: { notEmpty: true, errorMessage: 'requestId is Required' },
type: { notEmpty: true, errorMessage: 'type is Required' },
});
const errors = req.validationErrors();
if (errors) {
return Helpers.error(res, errors);
}
const { requestid, type } = req.headers;
const busboy = new Busboy({headers: req.headers});
let uploadStartTime = new Date(),
busboyFinishTime = null,
s3UploadFinishTime = null;
const totalSize = req.headers['content-length'];
const db = firebaseAdmin.database();
let ref = db.ref(`${requestid}/response-upload`);
let urlData;
let filenameUpload;
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
s3.upload({
Bucket: `${config.get('AWS_CREDENTIAL').BUCKET_NAME}`,
Key: `${moment().format('YYYYMMDDHHmmss')}-${filename}`,
Body: file,
options: {partSize: 5 * 1024 * 1024, queueSize: 10}
}).on('httpUploadProgress', function (evt) {
const percent = Math.round((evt.loaded * 100) / totalSize);
ref.set({
progress: percent
});
}).send(function (err, data) {
urlData = data.Location;
filenameUpload = data.Key;
s3UploadFinishTime = new Date();
if (err) {
ref.remove()
return Helpers.error(
res,
err,
HttpStatus.badRequest
);
}
if(busboyFinishTime && s3UploadFinishTime) {
ref.remove()
return Helpers.response(res, {
success: true,
file: {
url: urlData,
name: filenameUpload
},
time: {
uploadStartTime: uploadStartTime,
busboyFinishTime: busboyFinishTime,
s3UploadFinishTime: s3UploadFinishTime
}
});
}
});
});
busboy.on('finish', function() {
busboyFinishTime = new Date();
if(busboyFinishTime && s3UploadFinishTime) {
res.json({
uploadStartTime: uploadStartTime,
busboyFinishTime: busboyFinishTime,
s3UploadFinishTime: s3UploadFinishTime
});
}
});
req.pipe(busboy);
} catch (error) {
return Helpers.error(
res,
error || 'Failed upload data',
HttpStatus.internalServerError
);
}
};
module.exports = (router) => {
router.post('/', uploadController);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment