rejuvallife/resources/js/@fake-db/jwt/index.js
2024-10-25 01:02:11 +05:00

163 lines
4.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import mock from '@/@fake-db/mock'
import { genId } from '@/@fake-db/utils'
import avatar1 from '@images/avatars/avatar-1.png'
import avatar2 from '@images/avatars/avatar-2.png'
// TODO: Use jsonwebtoken pkg
// Created from https://jwt.io/ using HS256 algorithm
// We didn't created it programmatically because jsonwebtoken package have issues with esm support. View Issues: https://github.com/auth0/node-jsonwebtoken/issues/655
const userTokens = [
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0.fhc3wykrAnRpcKApKhXiahxaOe8PSHatad31NuIZ0Zg',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Mn0.cat2xMrZLn0FwicdGtZNzL7ifDTAKWB0k1RurSWjdnw',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6M30.PGOfMaZA_T9W05vMj5FYXG5d47soSPJD1WuxeUfw4L4',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NH0.d_9aq2tpeA9-qpqO0X4AmW6gU2UpWkXwc04UJYFWiZE',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NX0.ocO77FbjOSU1-JQ_BilEZq2G_M8bCiB10KYqtfkv1ss',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Nn0.YgQILRqZy8oefhTZgJJfiEzLmhxQT_Bd2510OvrrwB8',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6N30.KH9RmOWIYv_HONxajg7xBIJXHEUvSdcBygFtS2if8Jk',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OH0.shrp-oMHkVAkiMkv_aIvSx3k6Jk-X7TrH5UeufChz_g',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OX0.9JD1MR3ZkwHzhl4mOHH6lGG8hOVNZqDNH6UkFzjCqSE',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTB9.txWLuN4QT5PqTtgHmlOiNerIu5Do51PpYOiZutkyXYg',
]
// ❗ These two secrets shall be in .env file and not in any other file
// const jwtSecret = 'dd5f3089-40c3-403d-af14-d0c228b05cb4'
const database = [
{
id: 1,
fullName: 'John Doe',
username: 'johndoe',
password: 'admin',
avatar: avatar1,
email: 'admin@demo.com',
role: 'admin',
abilities: [
{
action: 'manage',
subject: 'all',
},
],
},
{
id: 2,
fullName: 'Jane Doe',
username: 'janedoe',
password: 'client',
avatar: avatar2,
email: 'client@demo.com',
role: 'client',
abilities: [
{
action: 'read',
subject: 'Auth',
},
{
action: 'read',
subject: 'AclDemo',
},
],
},
]
mock.onPost('/auth/login').reply(request => {
const { email, password } = JSON.parse(request.data)
let errors = {
email: ['Something went wrong'],
}
const user = database.find(u => u.email === email && u.password === password)
if (user) {
try {
const accessToken = userTokens[user.id]
// We are duplicating user here
const userData = { ...user }
const userOutData = Object.fromEntries(Object.entries(userData)
.filter(([key, _]) => !(key === 'password' || key === 'abilities')))
const response = {
userAbilities: userData.abilities,
accessToken,
userData: userOutData,
}
// const accessToken = jwt.sign({ id: user.id }, jwtSecret)
return [200, response]
}
catch (e) {
errors = { email: [e] }
}
}
else {
errors = {
email: ['Email or Password is Invalid'],
}
}
return [400, { errors }]
})
mock.onPost('/auth/register').reply(request => {
const { username, email, password } = JSON.parse(request.data)
// If not any of data is missing return 400
if (!(username && email && password))
return [400]
const isEmailAlreadyInUse = database.find(user => user.email === email)
const isUsernameAlreadyInUse = database.find(user => user.username === username)
const errors = {
password: !password ? ['Please enter password'] : null,
email: (() => {
if (!email)
return ['Please enter your email.']
if (isEmailAlreadyInUse)
return ['This email is already in use.']
return null
})(),
username: (() => {
if (!username)
return ['Please enter your username.']
if (isUsernameAlreadyInUse)
return ['This username is already in use.']
return null
})(),
}
if (!errors.username && !errors.email) {
// Calculate user id
const userData = {
id: genId(database),
email,
password,
username,
fullName: '',
role: 'admin',
abilities: [
{
action: 'manage',
subject: 'all',
},
],
}
database.push(userData)
const accessToken = userTokens[userData.id]
const { password: _, abilities, ...user } = userData
const response = {
userData: user,
accessToken,
userAbilities: abilities,
}
return [200, response]
}
return [400, { error: errors }]
})