From 72b27223cca076b11b0a1bec90023ffe447c505d Mon Sep 17 00:00:00 2001 From: Carolina Mitchell Date: Fri, 21 Feb 2025 05:11:33 +1300 Subject: [PATCH] Prettify code --- src/Routes/users.ts | 395 ++++++++++++++++++--------------- src/Util/Function/variables.ts | 18 +- 2 files changed, 226 insertions(+), 187 deletions(-) diff --git a/src/Routes/users.ts b/src/Routes/users.ts index 792d8445..1d38978f 100644 --- a/src/Routes/users.ts +++ b/src/Routes/users.ts @@ -846,218 +846,257 @@ router.get( ); /* Route that displays the templates/users/data view. A centre for a user to manage their data (download or delete). */ -router.get("/account/data", variables, permission.auth, async (req: Request, res: Response) => { - let dataRequestTimeout = false; +router.get( + "/account/data", + variables, + permission.auth, + async (req: Request, res: Response) => { + let dataRequestTimeout = false; - // Checks if req.user.db.lastDataRequest is not null; if it is not, checks whether lastDataRequest occurred less than 24 hours ago. If so, returns true. - if (req.user.db.lastDataRequest && ((Date.now() - req.user.db.lastDataRequest) / (1000 * 60 * 60) < 24)) dataRequestTimeout = true; + // Checks if req.user.db.lastDataRequest is not null; if it is not, checks whether lastDataRequest occurred less than 24 hours ago. If so, returns true. + if ( + req.user.db.lastDataRequest && + (Date.now() - req.user.db.lastDataRequest) / (1000 * 60 * 60) < 24 + ) + dataRequestTimeout = true; - res.render("templates/users/data", { - title: res.__("common.nav.me.data"), - subtitle: res.__("common.nav.me.data.subtitle"), - req, - dataRequestTimeout - }); -}); + res.render("templates/users/data", { + title: res.__("common.nav.me.data"), + subtitle: res.__("common.nav.me.data.subtitle"), + req, + dataRequestTimeout + }); + } +); /* Route that on successful requests, downloads the user's data that is stored in the database. */ -router.get("/account/data/request", variables, permission.auth, async (req: Request, res: Response) => { - // Checks if req.user.db.lastDataRequest is not null; if it is not, checks whether lastDataRequest occurred less than 24 hours ago. If so, returns true. - if (req.user.db.lastDataRequest && ((Date.now() - req.user.db.lastDataRequest) / (1000 * 60 * 60) < 24)) return res.status(429).render("status", { - res, - title: res.__("common.error"), - status: 429, - subtitle: res.__("common.error.account.data.alreadyDownloaded"), - req, - type: "Error" - }); +router.get( + "/account/data/request", + variables, + permission.auth, + async (req: Request, res: Response) => { + // Checks if req.user.db.lastDataRequest is not null; if it is not, checks whether lastDataRequest occurred less than 24 hours ago. If so, returns true. + if ( + req.user.db.lastDataRequest && + (Date.now() - req.user.db.lastDataRequest) / (1000 * 60 * 60) < 24 + ) + return res.status(429).render("status", { + res, + title: res.__("common.error"), + status: 429, + subtitle: res.__("common.error.account.data.alreadyDownloaded"), + req, + type: "Error" + }); - const userData: delUser = await global.db - .collection("users") - .findOne({ _id: req.user.id }); + const userData: delUser = await global.db + .collection("users") + .findOne({ _id: req.user.id }); - const userBotsData: delBot[] = await global.db - .collection("bots") - .find({ "owner.id": req.user.id }) - .toArray(); + const userBotsData: delBot[] = await global.db + .collection("bots") + .find({ "owner.id": req.user.id }) + .toArray(); - const userServersData: delServer[] = await global.db - .collection("servers") - .find({ "owner.id": req.user.id }) - .toArray(); + const userServersData: delServer[] = await global.db + .collection("servers") + .find({ "owner.id": req.user.id }) + .toArray(); - const userTemplateData: delTemplate[] = await global.db - .collection("templates") - .find({ "owner.id": req.user.id }) - .toArray(); + const userTemplateData: delTemplate[] = await global.db + .collection("templates") + .find({ "owner.id": req.user.id }) + .toArray(); - // Filter userData to remove auth Object - delete userData.auth; + // Filter userData to remove auth Object + delete userData.auth; - // Filter userBots.votes to not expose user ID's of persons who up/downvoted a bot an instead show number inside of the existing string[] - for (const bot of userBotsData) { - const positiveVotes = bot.votes.positive.length; - const negativeVotes = bot.votes.negative.length; + // Filter userBots.votes to not expose user ID's of persons who up/downvoted a bot an instead show number inside of the existing string[] + for (const bot of userBotsData) { + const positiveVotes = bot.votes.positive.length; + const negativeVotes = bot.votes.negative.length; - bot.votes.positive = [positiveVotes.toString()]; - bot.votes.negative = [negativeVotes.toString()]; + bot.votes.positive = [positiveVotes.toString()]; + bot.votes.negative = [negativeVotes.toString()]; - delete bot.token; - } + delete bot.token; + } - /* + /* Updates 'lastDataRequest' in the database so that any future attempted requests are checked against this. If the next attempted request is less than 24 hours relative to this current time, it will be denied. */ - await global.db.collection("users").updateOne( - { _id: req.user.id }, - { - $set: { - lastDataRequest: Date.now() + await global.db.collection("users").updateOne( + { _id: req.user.id }, + { + $set: { + lastDataRequest: Date.now() + } } - } - ); - - userCache.updateUser(req.user.id); - - res.setHeader("Content-disposition", `attachment; filename="del_data_user_${userData._id}.json"`); - res.send(JSON.stringify({ - user: userData, - bots: userBotsData, - servers: userServersData, - templates: userTemplateData - }, null, 4)); -}); - -/* Route that on successful requests, deletes the user's account and terminates their session. */ -router.post("/account/data/delete", variables, permission.auth, async (req: Request, res: Response) => { - // Checks if the user's username is equal to the username they provided in the deletion form - if (req.user.db.fullUsername !== req.body.typedUsername) return res.status(400).render("status", { - res, - title: res.__("common.error"), - status: 400, - subtitle: res.__("common.error.account.data.confirmationUsernameIncorrect"), - req, - type: "Error" - }); - - const userBotsData: delBot[] = await global.db - .collection("bots") - .find({ "owner.id": req.user.id }) - .toArray(); - - const userServersData: delServer[] = await global.db - .collection("servers") - .find({ "owner.id": req.user.id }) - .toArray(); - - const userTemplatesData: delTemplate[] = await global.db - .collection("templates") - .find({ "owner.id": req.user.id }) - .toArray(); - - // Loops through the user's bots, servers and templates and deletes them from the database. - for (const bot of userBotsData) { - await global.db.collection("bots").deleteOne({ _id: bot._id }); - - await global.db.collection("audit").insertOne({ - type: "DELETE_BOT", - executor: req.user.id, - target: bot._id, - date: Date.now(), - reason: "Owner deleted their data and account." - }); + ); - await botCache.deleteBot(bot._id); + userCache.updateUser(req.user.id); - await discord.channels.logs.send( - `${settings.emoji.delete} **${functions.escapeFormatting( - req.user.db.fullUsername - )}** \`(${ - req.user.id - })\` deleted bot **${functions.escapeFormatting(bot.name)}** \`(${ - bot._id - })\`` + res.setHeader( + "Content-disposition", + `attachment; filename="del_data_user_${userData._id}.json"` + ); + res.send( + JSON.stringify( + { + user: userData, + bots: userBotsData, + servers: userServersData, + templates: userTemplateData + }, + null, + 4 + ) ); } +); - for (const server of userServersData) { - await global.db.collection("servers").deleteOne({ _id: server._id }); +/* Route that on successful requests, deletes the user's account and terminates their session. */ +router.post( + "/account/data/delete", + variables, + permission.auth, + async (req: Request, res: Response) => { + // Checks if the user's username is equal to the username they provided in the deletion form + if (req.user.db.fullUsername !== req.body.typedUsername) + return res.status(400).render("status", { + res, + title: res.__("common.error"), + status: 400, + subtitle: res.__( + "common.error.account.data.confirmationUsernameIncorrect" + ), + req, + type: "Error" + }); - await global.db.collection("audit").insertOne({ - type: "DELETE_SERVER", - executor: req.user.id, - target: server._id, - date: Date.now(), - reason: "Owner deleted their data and account." - }); + const userBotsData: delBot[] = await global.db + .collection("bots") + .find({ "owner.id": req.user.id }) + .toArray(); + + const userServersData: delServer[] = await global.db + .collection("servers") + .find({ "owner.id": req.user.id }) + .toArray(); + + const userTemplatesData: delTemplate[] = await global.db + .collection("templates") + .find({ "owner.id": req.user.id }) + .toArray(); + + // Loops through the user's bots, servers and templates and deletes them from the database. + for (const bot of userBotsData) { + await global.db.collection("bots").deleteOne({ _id: bot._id }); + + await global.db.collection("audit").insertOne({ + type: "DELETE_BOT", + executor: req.user.id, + target: bot._id, + date: Date.now(), + reason: "Owner deleted their data and account." + }); - await serverCache.deleteServer(server._id); + await botCache.deleteBot(bot._id); + + await discord.channels.logs.send( + `${settings.emoji.delete} **${functions.escapeFormatting( + req.user.db.fullUsername + )}** \`(${ + req.user.id + })\` deleted bot **${functions.escapeFormatting(bot.name)}** \`(${ + bot._id + })\`` + ); + } - await discord.channels.logs.send( - `${settings.emoji.delete} **${functions.escapeFormatting( - req.user.db.fullUsername - )}** \`(${ - req.user.id - })\` deleted server **${functions.escapeFormatting(server.name)}** \`(${ - server._id - })\`` - ); - } + for (const server of userServersData) { + await global.db + .collection("servers") + .deleteOne({ _id: server._id }); + + await global.db.collection("audit").insertOne({ + type: "DELETE_SERVER", + executor: req.user.id, + target: server._id, + date: Date.now(), + reason: "Owner deleted their data and account." + }); - for (const template of userTemplatesData) { - await global.db.collection("templates").deleteOne({ _id: template._id }); + await serverCache.deleteServer(server._id); + + await discord.channels.logs.send( + `${settings.emoji.delete} **${functions.escapeFormatting( + req.user.db.fullUsername + )}** \`(${ + req.user.id + })\` deleted server **${functions.escapeFormatting(server.name)}** \`(${ + server._id + })\`` + ); + } - await global.db.collection("audit").insertOne({ - type: "DELETE_TEMPLATE", - executor: req.user.id, - target: template._id, - date: Date.now(), - reason: "Owner deleted their data and account." - }); + for (const template of userTemplatesData) { + await global.db + .collection("templates") + .deleteOne({ _id: template._id }); + + await global.db.collection("audit").insertOne({ + type: "DELETE_TEMPLATE", + executor: req.user.id, + target: template._id, + date: Date.now(), + reason: "Owner deleted their data and account." + }); - await templateCache.deleteTemplate(template._id); + await templateCache.deleteTemplate(template._id); + + await discord.channels.logs.send( + `${settings.emoji.delete} **${functions.escapeFormatting( + req.user.db.fullUsername + )}** \`(${ + req.user.id + })\` deleted template **${functions.escapeFormatting(template.name)}** \`(${ + template._id + })\`` + ); + } - await discord.channels.logs.send( - `${settings.emoji.delete} **${functions.escapeFormatting( - req.user.db.fullUsername - )}** \`(${ - req.user.id - })\` deleted template **${functions.escapeFormatting(template.name)}** \`(${ - template._id - })\`` - ); - } + // Deletes the user's account from the database and cache. + await global.db.collection("users").deleteOne({ _id: req.user.id }); - // Deletes the user's account from the database and cache. - await global.db.collection("users").deleteOne({ _id: req.user.id }); + await userCache.deleteUser(req.user.id); - await userCache.deleteUser(req.user.id); + // Terminates the user's session. + req.logout((err) => { + if (err) { + // Returns error page with error log if session termination encounters an error. + return res.status(500).render("status", { + res, + title: res.__("common.error"), + status: 500, + subtitle: err, + req, + type: "Error" + }); + } - // Terminates the user's session. - req.logout((err) => { - if (err) { - // Returns error page with error log if session termination encounters an error. - return res.status(500).render("status", { + // Returns success status page if session terminates successfully. + return res.status(200).render("status", { res, - title: res.__("common.error"), - status: 500, - subtitle: err, - req, - type: "Error" + title: res.__("common.success"), + subtitle: res.__("common.success.account.delete"), + status: 200, + type: "Success", + req }); - } - - // Returns success status page if session terminates successfully. - return res.status(200).render("status", { - res, - title: res.__("common.success"), - subtitle: res.__("common.success.account.delete"), - status: 200, - type: "Success", - req }); - }); -}); + } +); export default router; diff --git a/src/Util/Function/variables.ts b/src/Util/Function/variables.ts index 30997832..cb0b5e58 100644 --- a/src/Util/Function/variables.ts +++ b/src/Util/Function/variables.ts @@ -211,15 +211,15 @@ export const variables = async ( res.setHeader( "Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' github.githubassets.com gist.github.com status.discordextremelist.xyz cdn.jsdelivr.net cdnjs.cloudflare.com static.cloudflareinsights.com browser.sentry-cdn.com js.sentry-cdn.com *.sentry.io fonts.googleapis.com fonts.gstatic.com stats.g.doubleclick.net data:; " + - "img-src * data:; " + - "worker-src 'self' blob:; " + - "frame-src * data:; " + - "media-src *; " + - "object-src 'none'; " + - "font-src 'self' fonts.gstatic.com cdnjs.cloudflare.com; " + - "connect-src 'self' *.sentry.io api.github.com; " + - "style-src 'self' 'unsafe-inline' fonts.googleapis.com cdnjs.cloudflare.com; " + - "form-action 'self';" + "img-src * data:; " + + "worker-src 'self' blob:; " + + "frame-src * data:; " + + "media-src *; " + + "object-src 'none'; " + + "font-src 'self' fonts.gstatic.com cdnjs.cloudflare.com; " + + "connect-src 'self' *.sentry.io api.github.com; " + + "style-src 'self' 'unsafe-inline' fonts.googleapis.com cdnjs.cloudflare.com; " + + "form-action 'self';" ); next();