From e8e69cec31c4bd2bc2c3a990a16c73a4c8132d6b Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Fri, 1 Nov 2019 00:26:01 -0400 Subject: [PATCH 1/3] Delete removes all data now --- functions/handlers/users.js | 113 +++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 46 deletions(-) diff --git a/functions/handlers/users.js b/functions/handlers/users.js index b455b02..672bacd 100644 --- a/functions/handlers/users.js +++ b/functions/handlers/users.js @@ -70,12 +70,14 @@ exports.signup = (req, res) => { }) .then((idToken) => { token = idToken; + const defaultImageUrl = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/no-img.png?alt=media`; const userCred = { email: newUser.email, handle: newUser.handle, createdAt: newUser.createdAt, userId, - followedTopics: [] + followedTopics: [], + imageUrl: defaultImageUrl }; return db.doc(`/users/${newUser.handle}`).set(userCred); }) @@ -179,57 +181,76 @@ exports.login = (req, res) => { } }; -//Deletes user account +//Deletes user account and all associated data exports.deleteUser = (req, res) => { - var currentUser; - firebase.auth().onAuthStateChanged(function(user) { - currentUser = user; - if (currentUser) { - var post_query = db.collection("posts").where("userHandle", "==", req.user.handle); - post_query.get() - .then(function(myPosts) { - myPosts.forEach(function(doc) { - doc.ref.delete(); - }); - return; + // Get the profile image filename + // `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media` + const imageFileName = req.userData.imageUrl.split('/o/')[1].split('?alt=')[0]; + const userId = req.userData.userId; + let errors = {}; + + function thenFunction(data) { + console.log(`${data} data for ${req.userData.handle} has been deleted.`); + } + + function catchFunction(data, err) { + console.error(err); + error[data] = err; + } + + // Deletes user from authentication + let auth = admin.auth().deleteUser(userId); + + // Deletes database data + let data = db.collection("users").doc(`${req.user.handle}`).delete(); + + // Deletes any custom profile image + let image; + if (imageFileName !== 'no-img.png') { + image = admin.storage().bucket().file(imageFileName).delete() + } else { + image = Promise.resolve(); + } + + // Deletes all users posts + let posts = db.collection("posts") + .where("userHandle", "==", req.user.handle) + .get() + .then((query) => { + query.forEach((snap) => { + snap.ref.delete(); }) - .then(function() { - res.status(200).send("Successfully removed all user's posts from database."); - return; - }) - .catch(function(err) { - res.status(500).send("Failed to remove all user's posts from database.", err); - }); + }) + + let promises = [ + auth + .then(thenFunction('auth')) + .catch((err) => catchFunction('auth', err)), + data + .then(thenFunction('data')) + .catch((err) => catchFunction('data', err)), + image + .then(thenFunction('image')) + .catch((err) => catchFunction('image', err)), + posts + .then(thenFunction('posts')) + .catch((err) => catchFunction('image', err)) + ]; + // Wait for all promises to resolve + let waitPromise = Promise.all(promises); - db.collection("users").doc(`${req.user.handle}`).delete() - .then(function() { - res.status(200).send("Sucessfully removed user from database."); - return; - }) - .catch(function(err) { - res.status(500).send("Failed to remove user from database.", err); - }); - - - - currentUser.delete() - .then(function() { - console.log("Successfully deleted user."); - res.status(200).send("Sucessfully deleted user."); - return; - }) - .catch(function(err) { - console.log("Failed to delete user.", err); - res.status(500).send("Failed to delete user."); - }); - } - else { - console.log("Failed to deleter user or cannot get user."); - res.status(500).send("Failed to deleter user or cannot get user."); + waitPromise.then(() => { + if (Object.keys(errors) > 0) { + return res.status(500).json(errors); + } else { + return res.status(200).json({message: `All data for ${req.userData.handle} has been deleted.`}); } - }); + }) + .catch((err) => { + return res.status(500).json({error: err}); + }) }; // Returns all data in the database for the user who is currently signed in From 1e4b2d16ef335e378440126d70641c95668a51a9 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Fri, 1 Nov 2019 00:29:22 -0400 Subject: [PATCH 2/3] Fix edge case --- functions/handlers/users.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/functions/handlers/users.js b/functions/handlers/users.js index 672bacd..91860f5 100644 --- a/functions/handlers/users.js +++ b/functions/handlers/users.js @@ -185,7 +185,11 @@ exports.login = (req, res) => { exports.deleteUser = (req, res) => { // Get the profile image filename // `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media` - const imageFileName = req.userData.imageUrl.split('/o/')[1].split('?alt=')[0]; + const imageFileName; + req.userData.imageUrl ? + imageFileName = req.userData.imageUrl.split('/o/')[1].split('?alt=')[0] : + imageFileName = 'no-img.png' + const userId = req.userData.userId; let errors = {}; @@ -195,7 +199,7 @@ exports.deleteUser = (req, res) => { function catchFunction(data, err) { console.error(err); - error[data] = err; + errors[data] = err; } // Deletes user from authentication From f1e436220580f715c386e9a86db4b0253528382e Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Fri, 1 Nov 2019 00:37:49 -0400 Subject: [PATCH 3/3] Change imageFileName from const to let --- functions/handlers/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/handlers/users.js b/functions/handlers/users.js index 91860f5..1314d8b 100644 --- a/functions/handlers/users.js +++ b/functions/handlers/users.js @@ -185,7 +185,7 @@ exports.login = (req, res) => { exports.deleteUser = (req, res) => { // Get the profile image filename // `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media` - const imageFileName; + let imageFileName; req.userData.imageUrl ? imageFileName = req.userData.imageUrl.split('/o/')[1].split('?alt=')[0] : imageFileName = 'no-img.png'