Created
August 29, 2020 08:23
-
-
Save harlesbayu/cffebf4a1f4c3a339eabd4f180ff58d8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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