130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
'use strict'
|
|
const User = use('App/Models/User');
|
|
const EmailUtils = use('App/Utils/EmailUtils');
|
|
const RedisUtils = use('App/Utils/RedisUtils');
|
|
class AuthController {
|
|
async registerIndex({view, auth, response}) {
|
|
if (auth.user) {
|
|
response.redirect('/');
|
|
return;
|
|
}
|
|
return view.render('register')
|
|
}
|
|
|
|
async loginIndex({view, auth, response}) {
|
|
if (auth.user) {
|
|
response.redirect('/');
|
|
return;
|
|
}
|
|
return view.render('login')
|
|
}
|
|
|
|
async register({request, response, view, session, auth}) {
|
|
const user = await User.create({
|
|
email: request.input('email'),
|
|
name: request.input('name'),
|
|
password: request.input('password'),
|
|
avatar: `/images/default-user-avatar.png`
|
|
});
|
|
if (user.id == 1) {
|
|
user.is_admin = true;
|
|
}
|
|
await user.save();
|
|
await auth.login(user);
|
|
await EmailUtils.sendWelcomeEmail(user);
|
|
response.redirect('/');
|
|
}
|
|
|
|
async login({request, response, auth, session}) {
|
|
console.log('login');
|
|
const {email, password} = request.all()
|
|
try {
|
|
const token = await auth.attempt(email, password);
|
|
const user = auth.user;
|
|
// user.last_logged_in = new Date();
|
|
// await user.save();
|
|
console.log('logged in');
|
|
} catch (e) {
|
|
console.error(e);
|
|
session.withErrors({loginError: 'Invalid Credentials'}).flashAll()
|
|
return response.redirect('back')
|
|
}
|
|
|
|
|
|
response.redirect('/');
|
|
}
|
|
|
|
async resetPasswordRequest({request, response, session}) {
|
|
const email = request.body.email;
|
|
// check if user exists
|
|
const queryResp = (await User.query().where({email}).fetch()).rows;
|
|
if (!queryResp.length) {
|
|
session.withErrors({userNotFound: 'No User with that email'}).flashAll();
|
|
return response.redirect('back');
|
|
}
|
|
const user = queryResp[0];
|
|
//
|
|
const tokenPayload = {id: user.id, email: user.email};
|
|
const token =
|
|
await RedisUtils.ExpiredToken.generateResetPasswordToken(tokenPayload);
|
|
const sent =
|
|
await EmailUtils.sendResetPassword({name: user.name, email}, token);
|
|
if (sent) {
|
|
session.flash({notification: `Email sent to ${email} !`});
|
|
response.redirect('/');
|
|
return;
|
|
}
|
|
session.withErrors({message: 'Email provider error'}).flashAll();
|
|
return response.redirect('back')
|
|
}
|
|
async resetPasswordRequestIndex({request, auth, response, view}) {
|
|
if (auth.user) {
|
|
response.redirect('/');
|
|
return;
|
|
}
|
|
return view.render('reset-password-request');
|
|
}
|
|
async resetPasswordIndex({request, response, session, view}) {
|
|
const token = request.params.token;
|
|
const tokenPayload = await RedisUtils.ExpiredToken.getTokenPayload(token);
|
|
if (!tokenPayload) {
|
|
session.withErrors({InvalidToken: 'Token Expired or Invalid...'})
|
|
.flashAll();
|
|
response.redirect('/');
|
|
return;
|
|
} else {
|
|
return view.render('reset-password', {token});
|
|
}
|
|
}
|
|
|
|
async resetPassword({request, view, session, response}) {
|
|
console.log('In function...');
|
|
const {token, password, confirm} = request.all();
|
|
if (password != confirm) {
|
|
session.withErrors({confirm: 'Please make sure passwords match'})
|
|
.flashAll();
|
|
return response.redirect('back');
|
|
}
|
|
const tokenPayload = await RedisUtils.ExpiredToken.getTokenPayload(token);
|
|
if (!tokenPayload) {
|
|
session.withErrors({InvalidToken: 'Token Expired or Invalid...'})
|
|
.flashAll();
|
|
response.redirect('/');
|
|
return;
|
|
}
|
|
const user = await User.find(tokenPayload.id);
|
|
user.password = password;
|
|
await user.save();
|
|
/// TODO: send an email to notify user about the change;
|
|
await RedisUtils.ExpiredToken.remove(token);
|
|
session.flash({notification: `Password changed successfully`});
|
|
return response.redirect('/');
|
|
}
|
|
|
|
async logout({auth, response}) {
|
|
await auth.logout();
|
|
response.redirect('/');
|
|
}
|
|
}
|
|
|
|
module.exports = AuthController
|