From c3fb3c8b528a9230b37e729e82dda8ea99ab07bd Mon Sep 17 00:00:00 2001 From: Okechi Onyeje Date: Sat, 29 Dec 2018 23:15:25 -0500 Subject: [PATCH] T-954157790482076: Add image upload endpoint for a user's profile --- src/config/router.js | 1 + src/ups/profiles/dao.js | 36 ++++++++++++++++++++++++++++++++++++ src/ups/profiles/handlers.js | 25 +++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/config/router.js b/src/config/router.js index 2701a77..acd5407 100644 --- a/src/config/router.js +++ b/src/config/router.js @@ -27,6 +27,7 @@ function router(app) { // Profile Endpoints app.post('/profiles/:profileNumber', ProfileHandlers.updateUserProfile); app.get('/profiles/:profileNumber', ProfileHandlers.getUserProfile); + app.put('/profiles/uploadImage/:profileNumber', ProfileHandlers.updateUserProfileImage); } module.exports = router; \ No newline at end of file diff --git a/src/ups/profiles/dao.js b/src/ups/profiles/dao.js index 4d3d1f3..6f40adc 100644 --- a/src/ups/profiles/dao.js +++ b/src/ups/profiles/dao.js @@ -1,4 +1,5 @@ const database = require('firebase-admin').database(); +const storage = require('firebase-admin').storage(); /** * Blind initializing function for a new user's default profile @@ -34,8 +35,43 @@ function getProfile(profileNumber, tagferId) { }); } +/** + * Updates a user's profile image + * @param {object} profileObj JSON object containing all image data for a profile captured from the frontend + * @param {number} profileNumber Number used to identify which profile a user wants to update/add image to + * @param {string} tagferId tagferId obtained by extracting from authorization header + * @returns {object} Object containing a Promise that contains the result of uploading profile image, and the image url | {promise, imageURL} + */ + +function updateProfileImage(profileImageObj, profileNumber, tagferId) { + //persist profile image data to firebase storage + var profileImageRef = storage.ref(`images/profiles/${tagferId}/profile${profileNumber}/${profileImageObj.name}`); + + var uploadTask = profileImageRef.put(profileImageObj.file, profileImageObj.metaData); + + return uploadTask.on('state_changed',(snapshot) => { + var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; + console.log('Upload is ' + progress + '% done'); + switch (snapshot.state) { + case 'paused': // or 'paused' + console.log('Upload is paused'); + break; + case 'running': // or 'running' + console.log('Upload is running'); + break; + } + }, (error) => {throw error} + , () => { + return uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => { + //save image url to user's selected profile + return {promise: database.ref(`/profiles/${tagferId}/profile${profileNumber}/imageURL`).set(downloadURL), imageURL: downloadURL}; + }).catch( (error) => {throw error}); + }) +} + module.exports = { updateProfile, createInitialProfiles, + updateProfileImage getProfile }; diff --git a/src/ups/profiles/handlers.js b/src/ups/profiles/handlers.js index 6085056..145eafb 100644 --- a/src/ups/profiles/handlers.js +++ b/src/ups/profiles/handlers.js @@ -32,6 +32,30 @@ async function updateUserProfile(req, res) { } } +/** + * Endpoints: PUT profiles/uploadImage/:profileNumber + * Updates user's profile with a profile image based on profile number given. + * This endpoint is called seperately in order to add an image to a profile. + * @param {Object} req {profileNumber} + * @param {Object} res + */ +async function updateUserProfileImage() { + const profileImageObj = req.body; + const sessionId = utils.getSessionIdFromAuthHeader(req, res); + + try { + const tagferId = authDao.getSession(sessionId).tagferId; + const result = profileDao.updateProfileImage(profileImageObj, req.params.profileNumber, tagferId) + result.promise.then( () => { + res.status(http.OK).json({imageURL: result.imageURL}); + }).catch( (error) => { + res.status(http.INTERNAL_SERVER_ERROR).json({error}) + }); + } catch (error) { + res.status(http.BAD_REQUEST).json({error}) + } +} + async function getUserProfile(req, res) { const profileNumber = req.params.profileNumber; if (!utils.isProfileNumberValid(profileNumber)) { @@ -52,5 +76,6 @@ async function getUserProfile(req, res) { module.exports = { updateUserProfile, + updateUserProfileImage getUserProfile } \ No newline at end of file