diff --git a/backend/dao/usersDAO.js b/backend/dao/usersDAO.js index 5639266b7..6676b79d0 100644 --- a/backend/dao/usersDAO.js +++ b/backend/dao/usersDAO.js @@ -1,6 +1,7 @@ const MonkeyError = require("../handlers/error"); const { mongoDB } = require("../init/mongodb"); const { checkAndUpdatePb } = require("../handlers/pb"); +const { updateAuthEmail } = require("../handlers/auth"); class UsersDAO { static async addUser(name, email, uid) { @@ -19,6 +20,12 @@ class UsersDAO { .updateOne({ uid }, { $set: { name } }); } + static async updateEmail(uid, email) { + const user = await mongoDB().collection("users").findOne({ uid }); + if (!user) throw new MonkeyError(404, "User not found"); + return await updateAuthEmail(uid, email); + } + static async getUser(uid) { const user = await mongoDB().collection("users").findOne({ uid }); if (!user) throw new MonkeyError(404, "User not found"); @@ -165,6 +172,40 @@ class UsersDAO { return ret; } + + static async resetPb(uid) { + const user = await mongoDB().collection("users").findOne({ uid }); + if (!user) throw new MonkeyError(404, "User not found"); + return await mongoDB() + .collection("users") + .updateOne({ uid }, { $set: { personalBests: {} } }); + } + + static async updateTypingStats(uid, restartCount, timeTyping) { + const user = await mongoDB().collection("users").findOne({ uid }); + if (!user) throw new MonkeyError(404, "User not found"); + + return await mongoDB() + .collection("users") + .updateOne( + { uid }, + { + $inc: { + startedTests: restartCount, + completedTests: 1, + timeTyping, + }, + } + ); + } + + static async unlinkDiscord(uid) { + const user = await mongoDB().collection("users").findOne({ uid }); + if (!user) throw new MonkeyError(404, "User not found"); + return await mongoDB() + .collection("users") + .updateOne({ uid }, { $set: { discordId: null } }); + } } module.exports = UsersDAO; diff --git a/backend/handlers/auth.js b/backend/handlers/auth.js index cb91d0b64..9cc4f89a3 100644 --- a/backend/handlers/auth.js +++ b/backend/handlers/auth.js @@ -4,4 +4,10 @@ module.exports = { async verifyIdToken(idToken) { return await admin.auth().verifyIdToken(idToken); }, + async updateAuthEmail(uid, email) { + return await admin.auth().updateUser(uid, { + email, + emailVerified: false, + }); + }, }; diff --git a/backend/handlers/user.js b/backend/handlers/user.js index 83be55347..c4ab5f212 100644 --- a/backend/handlers/user.js +++ b/backend/handlers/user.js @@ -1,118 +1,110 @@ +// async function incrementUserGlobalTypingStats(userData, resultObj) { +// let userGlobalStats = userData.globalStats; +// try { +// let newStarted; +// let newCompleted; +// let newTime; -async function incrementUserGlobalTypingStats(userData, resultObj) { - let userGlobalStats = userData.globalStats; - try { - let newStarted; - let newCompleted; - let newTime; +// let tt = 0; +// let afk = resultObj.afkDuration; +// if (afk == undefined) { +// afk = 0; +// } +// tt = resultObj.testDuration + resultObj.incompleteTestSeconds - afk; - let tt = 0; - let afk = resultObj.afkDuration; - if (afk == undefined) { - afk = 0; - } - tt = resultObj.testDuration + resultObj.incompleteTestSeconds - afk; +// if (userGlobalStats.started === undefined) { +// newStarted = resultObj.restartCount + 1; +// } else { +// newStarted = userGlobalStats.started + resultObj.restartCount + 1; +// } +// if (userGlobalStats.completed === undefined) { +// newCompleted = 1; +// } else { +// newCompleted = userGlobalStats.completed + 1; +// } +// if (userGlobalStats.time === undefined) { +// newTime = tt; +// } else { +// newTime = userGlobalStats.time + tt; +// } +// incrementPublicTypingStats(resultObj.restartCount + 1, 1, tt); +// User.findOne({ uid: userData.uid }, (err, user) => { +// user.globalStats = { +// started: newStarted, +// completed: newCompleted, +// time: roundTo2(newTime), +// }; +// user.save(); +// }); +// } catch (e) { +// console.error(`Error while incrementing stats for user ${uid}: ${e}`); +// } +// } +// app.get("/userResults", authenticateToken, (req, res) => { +// User.findOne({ uid: req.uid }, (err, user) => { +// if (err) res.status(500).send({ error: err }); +// res.status(200).send({ results: user.results }); +// }); +// res.sendStatus(200); +// }); - if (userGlobalStats.started === undefined) { - newStarted = resultObj.restartCount + 1; - } else { - newStarted = userGlobalStats.started + resultObj.restartCount + 1; - } - if (userGlobalStats.completed === undefined) { - newCompleted = 1; - } else { - newCompleted = userGlobalStats.completed + 1; - } - if (userGlobalStats.time === undefined) { - newTime = tt; - } else { - newTime = userGlobalStats.time + tt; - } - incrementPublicTypingStats(resultObj.restartCount + 1, 1, tt); - User.findOne({ uid: userData.uid }, (err, user) => { - user.globalStats = { - started: newStarted, - completed: newCompleted, - time: roundTo2(newTime), - }; - user.save(); - }); - } catch (e) { - console.error(`Error while incrementing stats for user ${uid}: ${e}`); - } -} - - -app.get("/userResults", authenticateToken, (req, res) => { - User.findOne({ uid: req.uid }, (err, user) => { - if (err) res.status(500).send({ error: err }); - res.status(200).send({ results: user.results }); - }); - res.sendStatus(200); -}); - - -app.post("/unlinkDiscord", authenticateToken, (req, res) => { - request = req.body.data; - try { - if (request === null || req.uid === undefined) { - res.status(200).send({ status: -999, message: "Empty request" }); - return; - } - User.findOne({ uid: req.uid }, (err, user) => { - user.discordId = null; - user.save(); - }) - .then((f) => { - res.status(200).send({ - status: 1, - message: "Unlinked", - }); - }) - .catch((e) => { - res.status(200).send({ - status: -999, - message: e.message, - }); - }); - } catch (e) { - res.status(200).send({ - status: -999, - message: e, - }); - } -}); - - - -app.post("/updateEmail", authenticateToken, (req, res) => { - try { - admin - .auth() - .getUser(req.uid) - .then((previous) => { - if (previous.email !== req.body.previousEmail) { - res.send({ resultCode: -1 }); - } else { - User.findOne({ uid: req.uid }, (err, user) => { - user.email = req.body.newEmail; - user.emailVerified = false; - user.save(); - res.send({ resultCode: 1 }); - }); - } - }); - } catch (e) { - console.error(`error updating email for ${req.uid} - ${e}`); - res.send({ - resultCode: -999, - message: e.message, - }); - } -}); - +// app.post("/unlinkDiscord", authenticateToken, (req, res) => { +// request = req.body.data; +// try { +// if (request === null || req.uid === undefined) { +// res.status(200).send({ status: -999, message: "Empty request" }); +// return; +// } +// User.findOne({ uid: req.uid }, (err, user) => { +// user.discordId = null; +// user.save(); +// }) +// .then((f) => { +// res.status(200).send({ +// status: 1, +// message: "Unlinked", +// }); +// }) +// .catch((e) => { +// res.status(200).send({ +// status: -999, +// message: e.message, +// }); +// }); +// } catch (e) { +// res.status(200).send({ +// status: -999, +// message: e, +// }); +// } +// }); +// app.post("/updateEmail", authenticateToken, (req, res) => { +// try { +// admin +// .auth() +// .getUser(req.uid) +// .then((previous) => { +// if (previous.email !== req.body.previousEmail) { +// res.send({ resultCode: -1 }); +// } else { +// User.findOne({ uid: req.uid }, (err, user) => { +// user.email = req.body.newEmail; +// user.emailVerified = false; +// user.save(); +// res.send({ resultCode: 1 }); +// }); +// } +// }); +// } catch (e) { +// console.error(`error updating email for ${req.uid} - ${e}`); +// res.send({ +// resultCode: -999, +// message: e.message, +// }); +// } +// }); app.post("/verifyDiscord", authenticateToken, (req, res) => { /* Not tested yet */ @@ -178,18 +170,18 @@ app.post("/verifyDiscord", authenticateToken, (req, res) => { } }); -app.post("/resetPersonalBests", authenticateToken, (req, res) => { - try { - User.findOne({ uid: req.uid }, (err, user) => { - if (err) res.status(500).send({ error: err }); - user.personalBests = {}; - user.save(); - }); - res.status(200).send({ status: "Reset Pbs successfully" }); - } catch (e) { - console.log( - `something went wrong when deleting personal bests for ${uid}: ${e.message}` - ); - res.status(500).send({ status: "Reset Pbs successfully" }); - } -}); +// app.post("/resetPersonalBests", authenticateToken, (req, res) => { +// try { +// User.findOne({ uid: req.uid }, (err, user) => { +// if (err) res.status(500).send({ error: err }); +// user.personalBests = {}; +// user.save(); +// }); +// res.status(200).send({ status: "Reset Pbs successfully" }); +// } catch (e) { +// console.log( +// `something went wrong when deleting personal bests for ${uid}: ${e.message}` +// ); +// res.status(500).send({ status: "Reset Pbs successfully" }); +// } +// });