From 93abf4b631d3daf33fbc70eef4d2b6233dd5a8fd Mon Sep 17 00:00:00 2001 From: Colin Kallemein Date: Sun, 3 Nov 2024 00:50:00 +0100 Subject: [PATCH] Updated token hash, use repo instead of prisma for data fetching --- .../passwordResetTokenRepository.ts | 31 ++++++++++ src/services/userService.ts | 56 ++++++++++--------- src/utilities/http.ts | 2 +- 3 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 src/repositories/passwordResetTokenRepository.ts diff --git a/src/repositories/passwordResetTokenRepository.ts b/src/repositories/passwordResetTokenRepository.ts new file mode 100644 index 0000000..ccf2b64 --- /dev/null +++ b/src/repositories/passwordResetTokenRepository.ts @@ -0,0 +1,31 @@ +import prisma from '../utilities/prisma' // Import the global Prisma instance + +class PasswordResetTokenRepository { + async getById(id: number): Promise { + try { + return await prisma.passwordResetToken.findUnique({ + where: { + id + } + }) + } catch (error: any) { + // Handle error + throw new Error(`Failed to get password reset token by ID: ${error.message}`) + } + } + + async getByUserId(userId: number): Promise { + try { + return await prisma.passwordResetToken.findFirst({ + where: { + userId + } + }) + } catch (error: any) { + // Handle error + throw new Error(`Failed to get password reset token by user ID: ${error.message}`) + } + } +} + +export default new PasswordResetTokenRepository() diff --git a/src/services/userService.ts b/src/services/userService.ts index bca4298..f3a4927 100644 --- a/src/services/userService.ts +++ b/src/services/userService.ts @@ -1,5 +1,6 @@ import bcrypt from 'bcryptjs' import UserRepository from '../repositories/userRepository' +import PasswordResetTokenRepository from '../repositories/passwordResetTokenRepository' import prisma from '../utilities/prisma' import { User, PasswordResetToken } from '@prisma/client' import config from '../utilities/config' @@ -61,12 +62,13 @@ class UserService { * Reset password * @param email */ - async resetPassword(email: string): Promise { + async resetPassword(email: string): Promise { const user = await UserRepository.getByEmail(email) - if ( !user ) return - const token = await bcrypt.genSalt(10) - const latestToken = await prisma.passwordResetToken.findFirst({ where: { userId: user.id } }) + if ( !user ) return false + + const token = await bcrypt.hash(new Date().getTime().toString(), 10) + const latestToken = await PasswordResetTokenRepository.getByUserId(user.id) //Check if password reset has been requested recently if (latestToken) { @@ -74,7 +76,7 @@ class UserService { const tokenExpiryDate = new Date(Date.now() - 24 * 60 * 60 * 1000); const isTokenExpired = latestToken.createdAt < tokenExpiryDate - if (!isTokenExpired) return + if (!isTokenExpired) return false } prisma.passwordResetToken.create({ @@ -84,31 +86,31 @@ class UserService { } }); - return + const transporter = NodeMailer.createTransport({ + host: config.SMTP_HOST, + port: config.SMTP_PORT, + secure: false, + auth: { + user: config.SMTP_USER, + pass: config.SMTP_PASSWORD, + }, + }); - // const transporter = NodeMailer.createTransport({ - // host: config.SMTP_HOST, - // port: config.SMTP_PORT, - // secure: false, - // auth: { - // user: config.SMTP_USER, - // pass: config.SMTP_PASSWORD, - // }, - // }); - // - // const info = await transporter.sendMail({ - // from: config.SMTP_USER, - // to: email, - // subject: "Reset your password", - // text: "A password reset has been requested, reset your password here: " + config.CLIENT_URL + "/" + token, // Plain text body - // html: "

A password reset has been requested, reset your password here: " + config.CLIENT_URL + "/" + token + "

", // Html body - // }); - // console.log("Message sent: %s", info.messageId); + try { + await transporter.sendMail({ + from: config.SMTP_USER, + to: email, + subject: "Reset your password", + text: "A password reset has been requested, reset your password here: " + config.CLIENT_URL + "/#" + token, // Plain text body + html: "

A password reset has been requested, reset your password here: " + config.CLIENT_URL + "/#token=" + token + "

", // Html body + }); + return true + } catch (error: any) { + return false + } + } - // if (info) { - // return true - // } } } diff --git a/src/utilities/http.ts b/src/utilities/http.ts index 4e103df..912f652 100644 --- a/src/utilities/http.ts +++ b/src/utilities/http.ts @@ -62,7 +62,7 @@ async function addHttpRoutes(app: Application) { }) /** - * Register + * Reset password * @param req * @param res */