diff options
Diffstat (limited to 'routes/routes.js')
-rw-r--r-- | routes/routes.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/routes/routes.js b/routes/routes.js new file mode 100644 index 0000000..b1cfeec --- /dev/null +++ b/routes/routes.js @@ -0,0 +1,71 @@ +const router = require('express').Router() +const { randomBytes } = require('crypto') +const createJwt = require('../helpers/createJwt') +const User = require('../model/User') + +// Alive +router.get("/", (_, res) => res.send("Auth service is up.") ) + +// Register +router.post('/register', async (req, res) => { + const refreshToken = randomBytes(32).toString('hex') + const newUser = new User({ + email: req.body.email, + password: req.body.password, + sessions: [{ + device: req.body.device, + refreshToken, + }], + }) + + try { + const user = await newUser.save() + const sessionId = user.sessions[0]._id + const jwtToken = createJwt(user, sessionId) + + res.status(201).send({ sessionId, jwtToken, refreshToken }) + } catch(err) { + if (err._message) { + res.status(422).send({ error: err._message }) + } else if (err.code && err.code === 11000) { + res.status(409).send({ error: 'User with this email already exist' }) + } else { + res.status(400).send({ error: 'Could not save the user' }) + } + } +}) + +// Login +router.post('/login', async (req, res) => { + try { + const { user, refreshToken } = await User.newSession(req.body) + const sessionId = user.sessions[user.sessions.length - 1]._id + const jwtToken = createJwt(user, sessionId) + + res.status(202).send({ sessionId, jwtToken, refreshToken }) + } catch (err) { + res.status(401).send({ error: 'Could not log in.' }) + } +}) + +// Refresh token +router.post('/refresh', async (req, res) => { + try { + const user = await User.checkRefreshToken(req.body) + + if (!user) throw new Error() + + const refreshToken = await User.refreshExistingToken({ user, sessionId: req.body.sessionId }) + + if (!refreshToken) throw new Error() + + const jwtToken = createJwt(user) + + res.status(201).send({ sessionId: req.body.sessionId, jwtToken, refreshToken }) + } catch (err) { + console.log(err) + res.status(401).send({ error: 'Could not refresh token' }) + } +}) + +module.exports = router |