aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2022-06-03 17:22:43 +0530
committerBobby <[email protected]>2022-06-03 17:22:43 +0530
commit93640b6ec08bb25e24841b9084e954d7c6521611 (patch)
treec2e55dc0bab93bc1baf82999d781fd6420d37ea7
parent692eecf32e4d569a55de2c4b5abb6a6897c88abe (diff)
downloadthatcomputerscientist-93640b6ec08bb25e24841b9084e954d7c6521611.tar.xz
thatcomputerscientist-93640b6ec08bb25e24841b9084e954d7c6521611.zip
update account details
-rw-r--r--package-lock.json57
-rw-r--r--package.json1
-rw-r--r--routes/account.routes.js41
-rw-r--r--views/account.ejs16
4 files changed, 110 insertions, 5 deletions
diff --git a/package-lock.json b/package-lock.json
index e7379cf0..ea8d92f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"express": "^4.18.1",
"express-session": "^1.17.3",
"jsonwebtoken": "^8.5.1",
+ "md5": "^2.3.0",
"mysql2": "^2.3.3",
"node-fetch": "^3.2.5"
},
@@ -333,6 +334,14 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -497,6 +506,14 @@
"node": ">= 0.10"
}
},
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@@ -1080,6 +1097,11 @@
"node": ">=8"
}
},
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
"node_modules/is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
@@ -1367,6 +1389,16 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/md5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+ "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "dependencies": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "~1.1.6"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -2595,6 +2627,11 @@
"supports-color": "^7.1.0"
}
},
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
+ },
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -2717,6 +2754,11 @@
"vary": "^1"
}
},
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
+ },
"crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@@ -3160,6 +3202,11 @@
"binary-extensions": "^2.0.0"
}
},
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
"is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
@@ -3390,6 +3437,16 @@
}
}
},
+ "md5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+ "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "~1.1.6"
+ }
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
diff --git a/package.json b/package.json
index 625c1555..2ac6944c 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"express": "^4.18.1",
"express-session": "^1.17.3",
"jsonwebtoken": "^8.5.1",
+ "md5": "^2.3.0",
"mysql2": "^2.3.3",
"node-fetch": "^3.2.5"
},
diff --git a/routes/account.routes.js b/routes/account.routes.js
index 7b5660b4..8a6a0b21 100644
--- a/routes/account.routes.js
+++ b/routes/account.routes.js
@@ -3,6 +3,7 @@ const { renderRoute } = require("../functions/render");
const mysql = require("mysql2");
const jwt = require("jsonwebtoken");
const connectionString = process.env.DATABASE_URL;
+const md5 = require("md5");
router.get('/', (req, res) => {
const username = jwt.decode(req.cookies.token).username;
@@ -18,7 +19,10 @@ router.get('/', (req, res) => {
if (results.length > 0) {
const user = results[0];
renderRoute(req, res, 'account', 'My Account', true, {
- user: user
+ user: {
+ ...user,
+ avatar: md5(user.email || '')
+ }
});
} else {
renderRoute(req, res, 'account', 'My Account', true, {
@@ -30,5 +34,40 @@ router.get('/', (req, res) => {
connection.end();
});
+router.post('/updateAccount', (req, res) => {
+ jwt.verify(req.cookies.token, process.env.AUTHORIZATION_STRING, (err, decoded) => {
+ if (err) {
+ renderRoute(req, res, 'error', 'Error', false)
+ } else {
+ const username = decoded.username;
+ const firstname = req.body.firstname;
+ const lastname = req.body.lastname;
+ const email = req.body.email;
+ const location = req.body.location;
+ const bio = req.body.bio;
+ const public = req.body.isPublic;
+ const connection = mysql.createPool(connectionString);
+ connection.getConnection((err, connection) => {
+ if (err) {
+ renderRoute(req, res, 'error', 'Error', false, {
+ error: err.message
+ });
+ } else {
+ const sql = "UPDATE Profiles SET firstname = ?, lastname = ?, email = ?, location = ?, bio = ?, public = ? WHERE username = ?";
+ connection.query(sql, [firstname, lastname, email, location, bio, public, username], (err, results, fields) => {
+ if (err) {
+ req.flash('updateaccerror', err.message);
+ res.redirect(req.get('referer'));
+ } else {
+ req.flash('updateaccsuccess', 'Account updated successfully');
+ res.redirect(req.get('referer'));
+ }
+ });
+ }
+ });
+ }
+ });
+});
+
module.exports = router;
diff --git a/views/account.ejs b/views/account.ejs
index f3bc3359..8fa8154c 100644
--- a/views/account.ejs
+++ b/views/account.ejs
@@ -41,8 +41,10 @@
</form>
</div>
<div class="ac-main">
- <p>Account URL: <a href="/profile/<%= user.username %>"><span id="accountURL"></span></a></p>
- <form method="post" onsubmit="event.preventDefault();">
+ <% if (user.public == 1) { %>
+ <p>Account URL: <a href="/profile/<%= user.username %>"><span id="accountURL"></span></a></p>
+ <% } %>
+ <form method="post" action="/account/updateAccount">
<fieldset>
<legend>Account Details</legend>
<label for="firstname">First Name</label>
@@ -57,10 +59,16 @@
<textarea name="bio" id="bio" placeholder="Bio"><%= user.bio %></textarea>
<label for="isPublic">Account Visibility</label>
<select name="isPublic" id="isPublic">
- <option value="0" <% if (user.isPublic == 0) { %>selected="selected"<% } %>>Private</option>
- <option value="1" <% if (user.isPublic == 1) { %>selected="selected"<% } %>>Public</option>
+ <option value="0" <% if (user.public == 0) { %>selected="selected"<% } %>>Private</option>
+ <option value="1" <% if (user.public == 1) { %>selected="selected"<% } %>>Public</option>
</select>
<input type="submit" value="Update Account" />
+ <% if (locals.messages.updateaccsuccess) { %>
+ <p class="success"><%= messages.updateaccsuccess %></p>
+ <% } %>
+ <% if (locals.messages.updateaccerror) { %>
+ <p class="error"><%= messages.updateaccerror %></p>
+ <% } %>
</fieldset>
</form>
</div>