summaryrefslogtreecommitdiffstats
path: root/routes/routes.js
diff options
context:
space:
mode:
Diffstat (limited to 'routes/routes.js')
-rw-r--r--routes/routes.js71
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