-
-
Save cyleecode/5651a3689394af003f303f415b7cdc99 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