summaryrefslogtreecommitdiffstats
path: root/backend/routes.js
diff options
context:
space:
mode:
Diffstat (limited to 'backend/routes.js')
-rw-r--r--backend/routes.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/backend/routes.js b/backend/routes.js
new file mode 100644
index 0000000..83748fb
--- /dev/null
+++ b/backend/routes.js
@@ -0,0 +1,114 @@
+const express = require('express');
+const router = express.Router();
+const sha512 = require('js-sha512');
+const shortid = require('shortid');
+
+const salt = 'suola';
+
+const low = require('lowdb');
+const FileSync = require('lowdb/adapters/FileSync');
+
+const adapter = new FileSync('db.json');
+const db = low(adapter);
+
+db.defaults({ users: [] }).write();
+
+router.get('/', (req, res) => {
+ res.json({
+ message: 'Backend API',
+ });
+});
+
+router.post('/register', (req, res) => {
+ const { username, password } = req.body;
+ if (!username || !password) {
+ res.status(400);
+ return res.json({
+ error: 'Username or password missing.',
+ });
+ }
+
+ const user = db.get('users').find({ username }).value();
+ if (user) {
+ res.status(400);
+ return res.json({
+ error: 'Username already taken.',
+ });
+ }
+
+ const pwHash = sha512(salt + password);
+ db.get('users').push({ username, password: pwHash }).write();
+ return res.json({
+ username,
+ });
+});
+
+router.post('/login', (req, res) => {
+ const { username, password } = req.body;
+ if (!username || !password) {
+ res.status(400);
+ return res.json({
+ error: 'Username or password missing.',
+ });
+ }
+
+ const userObj = db.get('users').find({ username });
+ const user = userObj.value();
+
+ if (user) {
+ const sessionId = shortid.generate();
+ userObj.assign({ sessionId }).write();
+ res.set('Set-Cookie', `sessionId=${sessionId}`);
+ return res.json({
+ username,
+ });
+ }
+
+ res.status(403);
+ res.json({
+ error: 'Wrong username or password',
+ });
+});
+
+router.post('/logout', (req, res) => {
+ const cookies = req.cookies;
+ const { sessionId } = cookies;
+
+ const userObj = db.get('users').find({ sessionId });
+ if (userObj) {
+ userObj.assign({ sessionId: null }).write();
+ }
+ res.status(204);
+ res.set('Set-Cookie', 'sessionId=deleted; expires=Thu, 01 Jan 1970 00:00:00 GMT');
+ res.send();
+});
+
+router.get('/user', (req, res) => {
+ const cookies = req.cookies;
+ const { sessionId } = cookies;
+
+ if (!sessionId) {
+ res.status(403);
+ return res.json({
+ message: 'Log in first!',
+ });
+ }
+
+ const userObj = db.get('users').find({ sessionId });
+ const user = userObj.value();
+
+ if (userObj) {
+ return res.json({
+ message: `Hello user ${user.username}!`,
+ username: user.username,
+ });
+ }
+
+ res.status(400);
+ return res.json({
+ message: 'Invalid session token.',
+ sessionId,
+ });
+});
+
+module.exports = router;