diff options
Diffstat (limited to 'backend/routes.js')
| -rw-r--r-- | backend/routes.js | 114 |
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; |
