diff --git a/functions/handlers/users.js b/functions/handlers/users.js index a3cea0d..2fdcd51 100644 --- a/functions/handlers/users.js +++ b/functions/handlers/users.js @@ -201,10 +201,10 @@ exports.deleteUser = (req, res) => { // Get the profile image filename // `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media` let imageFileName; - req.userData.imageUrl ? - imageFileName = req.userData.imageUrl.split('/o/')[1].split('?alt=')[0] : - imageFileName = 'no-img.png' - + req.userData.imageUrl + ? (imageFileName = req.userData.imageUrl.split("/o/")[1].split("?alt=")[0]) + : (imageFileName = "no-img.png"); + const userId = req.userData.userId; let errors = {}; @@ -221,56 +221,58 @@ exports.deleteUser = (req, res) => { let auth = admin.auth().deleteUser(userId); // Deletes database data - let data = db.collection("users").doc(`${req.user.handle}`).delete(); + 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() + 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") + let posts = db + .collection("posts") .where("userHandle", "==", req.user.handle) .get() - .then((query) => { - query.forEach((snap) => { + .then(query => { + query.forEach(snap => { snap.ref.delete(); }); return; - }) + }); 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)) + 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); - 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}); - }) + 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 @@ -351,55 +353,67 @@ exports.getAuthenticatedUser = (req, res) => { // Must be run by the Admin user exports.verifyUser = (req, res) => { if (req.userData.handle !== "Admin") { - return res.status(403).json({error: "This must be done as Admin"}); + return res.status(403).json({ error: "This must be done as Admin" }); } db.doc(`/users/${req.body.user}`) .get() - .then((doc) => { + .then(doc => { if (doc.exists) { let verifiedUser = doc.data(); verifiedUser.verified = true; - return db.doc(`/users/${req.body.user}`).set(verifiedUser, {merge: true}); + return db + .doc(`/users/${req.body.user}`) + .set(verifiedUser, { merge: true }); } else { - return res.status(400).json({error: `User ${req.body.user} was not found`}); + return res + .status(400) + .json({ error: `User ${req.body.user} was not found` }); } }) .then(() => { - return res.status(201).json({message: `${req.body.user} is now verified`}); + return res + .status(201) + .json({ message: `${req.body.user} is now verified` }); }) - .catch((err) => { + .catch(err => { console.error(err); - return res.status(500).json({error: err.code}); + return res.status(500).json({ error: err.code }); }); -} +}; // Unverifies the user sent to the request // Must be run by admin exports.unverifyUser = (req, res) => { if (req.userData.handle !== "Admin") { - return res.status(403).json({error: "This must be done as Admin"}); + return res.status(403).json({ error: "This must be done as Admin" }); } db.doc(`/users/${req.body.user}`) .get() - .then((doc) => { + .then(doc => { if (doc.exists) { let unverifiedUser = doc.data(); unverifiedUser.verified = false; - return db.doc(`/users/${req.body.user}`).set(unverifiedUser, {merge: true}); + return db + .doc(`/users/${req.body.user}`) + .set(unverifiedUser, { merge: true }); } else { - return res.status(400).json({error: `User ${req.body.user} was not found`}); + return res + .status(400) + .json({ error: `User ${req.body.user} was not found` }); } }) .then(() => { - return res.status(201).json({message: `${req.body.user} is no longer verified`}); + return res + .status(201) + .json({ message: `${req.body.user} is no longer verified` }); }) - .catch((err) => { + .catch(err => { console.error(err); - return res.status(500).json({error: err.code}); + return res.status(500).json({ error: err.code }); }); -} +}; exports.getUserHandles = (req, res) => { admin .firestore() @@ -417,3 +431,63 @@ exports.getUserHandles = (req, res) => { return res.status(500).json({ error: "Failed to get all user handles." }); }); }; + +exports.addSubscription = (req, res) => { + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef.get().then(doc => { + new_following = doc.data().following; + new_following.push(req.body.following); + + // add stuff + userRef + .set({ following: new_following }, { merge: true }) + .then(doc => { + return res + .status(201) + .json({ message: `Following ${req.body.following}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + }); +}; + +exports.getSubs = (req, res) => { + let data = []; + db.doc(`/users/${req.userData.handle}`) + .get() + .then(doc => { + data = doc.data().following; + return res.status(200).json({ data }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); +}; + +exports.removeSub = (req, res) => { + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef.get().then(doc => { + new_following = doc.data().following; + // remove username from array + new_following.forEach(function(follower, index) { + if (follower === `${req.body.unfollow}`) { + new_following.splice(index, 1); + } + }); + + // update database + userRef + .set({ following: new_following }, { merge: true }) + .then(doc => { + return res + .status(202) + .json({ message: `Successfully unfollow ${req.body.unfollow}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + }); +}; diff --git a/functions/index.js b/functions/index.js index f05c7b8..86231d0 100644 --- a/functions/index.js +++ b/functions/index.js @@ -19,7 +19,10 @@ const { updateProfileInfo, verifyUser, unverifyUser, - getUserHandles + getUserHandles, + addSubscription, + getSubs, + removeSub } = require("./handlers/users"); // Adds a user to the database and registers them in firebase with @@ -55,6 +58,15 @@ app.post("/unverifyUser", fbAuth, unverifyUser); // get user handles with search phase app.get("/getUserHandles", fbAuth, getUserHandles); +// get user's subscription +app.get("/getSubs", fbAuth, getSubs); + +// add user to another user's "following" data field +app.post("/addSubscription", fbAuth, addSubscription); + +// remove one subscription +app.delete("/removeSub", fbAuth, removeSub); + /*------------------------------------------------------------------* * handlers/post.js * *------------------------------------------------------------------*/