Updated token hash, use repo instead of prisma for data fetching

This commit is contained in:
Colin Kallemein 2024-11-03 00:50:00 +01:00
parent c04c52aed0
commit 93abf4b631
3 changed files with 61 additions and 28 deletions

View File

@ -0,0 +1,31 @@
import prisma from '../utilities/prisma' // Import the global Prisma instance
class PasswordResetTokenRepository {
async getById(id: number): Promise<any> {
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<any> {
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()

View File

@ -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<boolean | undefined> {
async resetPassword(email: string): Promise<boolean> {
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: "<p>A password reset has been requested, reset your password here: " + config.CLIENT_URL + "/" + token + "</p>", // 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: "<p>A password reset has been requested, reset your password here: <a href='" + config.CLIENT_URL + "/#" + token + "'>" + config.CLIENT_URL + "/#token=" + token + "</a></p>", // Html body
});
return true
} catch (error: any) {
return false
}
}
// if (info) {
// return true
// }
}
}

View File

@ -62,7 +62,7 @@ async function addHttpRoutes(app: Application) {
})
/**
* Register
* Reset password
* @param req
* @param res
*/