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;