80 lines
1.7 KiB
JavaScript
80 lines
1.7 KiB
JavaScript
const shortid = require('shortid')
|
|
|
|
const users = [
|
|
{
|
|
id: '__bot',
|
|
email: 'bot@bot.com',
|
|
password: 'bot',
|
|
nickname: 'The Bot',
|
|
tokens: []
|
|
}
|
|
]
|
|
|
|
exports.register = (input, context) => {
|
|
if (users.find(u => u.email === input.email)) {
|
|
throw new Error('Email already used')
|
|
}
|
|
|
|
return new Promise((resolve) => {
|
|
setTimeout(() => {
|
|
users.push({
|
|
id: shortid(),
|
|
email: input.email,
|
|
password: input.password,
|
|
nickname: input.nickname,
|
|
tokens: [],
|
|
})
|
|
|
|
resolve(true)
|
|
}, 100)
|
|
})
|
|
}
|
|
|
|
exports.login = ({ email, password }, context) => {
|
|
const user = users.find(
|
|
u => u.email === email && u.password === password
|
|
)
|
|
if (!user) throw new Error('User not found')
|
|
const token = {
|
|
id: shortid(),
|
|
userId: user.id,
|
|
expiration: Date.now() + 24 * 3600 * 1000,
|
|
}
|
|
user.tokens.push(token)
|
|
return {
|
|
user,
|
|
token,
|
|
}
|
|
}
|
|
|
|
exports.logout = (context) => {
|
|
if (context.userId && context.token) {
|
|
const user = exports.getOne(context.userId)
|
|
if (user) {
|
|
const index = user.tokens.findIndex(t => t.id === context.token.id)
|
|
if (index !== -1) user.tokens.splice(index, 1)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
exports.getOne = (id, context) => {
|
|
return users.find(u => u.id === id)
|
|
}
|
|
|
|
exports.validateToken = (token) => {
|
|
const user = exports.getOne(token.userId)
|
|
if (user) {
|
|
const storedToken = user.tokens.find(t => t.id === token.id)
|
|
if (storedToken) {
|
|
return storedToken.expiration === token.expiration && storedToken.expiration > Date.now()
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
exports.current = (context) => {
|
|
if (!context.userId) throw new Error('Unauthorized')
|
|
return exports.getOne(context.userId, context)
|
|
}
|