va-tracker-middleware/src/controllers/passwordReset.controllers.js

122 lines
4.3 KiB
JavaScript

import PasswordResetRepository from "../repository/passwordReset.repository.js";
import PasswordResetService from "../services/passwordReset.service.js";
// import EmailService from "../services/email.service.js";
import logger from "../config/logger.js";
const passwordResetService = new PasswordResetService(
new PasswordResetRepository(),
// new EmailService({
// host: process.env.SMTP_HOST,
// port: process.env.SMTP_PORT,
// user: process.env.SMTP_USER,
// pass: process.env.SMTP_PASS,
// from: process.env.EMAIL_FROM,
// })
);
// VA: Request password reset
async function va_request_password_reset(req, res) {
try {
const { email } = req.body;
if (!email) {
return res.status(400).json({ success: false, message: "Email is required" });
}
const result = await passwordResetService.requestPasswordReset(email, 'va');
logger.info(`VA password reset requested for: ${email}`);
return res.status(200).json(result);
} catch (error) {
logger.error(`VA PasswordResetController - Request error: ${error.message}`);
return res.status(500).json({ success: false, message: "Failed to process password reset request" });
}
}
// Client: Request password reset
async function client_request_password_reset(req, res) {
try {
const { email } = req.body;
if (!email) {
return res.status(400).json({ success: false, message: "Email is required" });
}
const result = await passwordResetService.requestPasswordReset(email, 'client');
logger.info(`Client password reset requested for: ${email}`);
return res.status(200).json(result);
} catch (error) {
logger.error(`Client PasswordResetController - Request error: ${error.message}`);
return res.status(500).json({ success: false, message: "Failed to process password reset request" });
}
}
// Render reset password form (shared for both VA and Client)
async function render_reset_form(req, res) {
try {
const { token, userType } = req.query;
if (!token || !userType) {
return res.render('auth/reset-password-error', { error: 'Reset token or user type is missing', userType: userType || 'va' });
}
// Validate token
const validation = await passwordResetService.validateResetToken(token, userType);
if (!validation.valid) {
return res.render('auth/reset-password-error', { error: validation.message, userType: userType || 'va' });
}
// Render reset form with token
res.render('auth/reset-password-form', { token, userType, error: null });
} catch (error) {
logger.error(`PasswordResetController - Render form error: ${error.message}`);
res.render('auth/reset-password-error', { error: 'Failed to load reset form' });
}
}
// Process password reset form submission (shared for both VA and Client)
async function process_reset(req, res) {
try {
const { token, password, confirmPassword, userType } = req.body;
if (!token || !password || !confirmPassword || !userType) {
return res.render('auth/reset-password-form', {
token, userType, error: 'All fields are required'
});
}
if (password !== confirmPassword) {
return res.render('auth/reset-password-form', {
token, userType, error: 'Passwords do not match'
});
}
if (password.length < 6) {
return res.render('auth/reset-password-form', {
token, userType, error: 'Password must be at least 6 characters long'
});
}
// Reset password
await passwordResetService.resetPassword(token, password, userType);
// Render success page
res.render('auth/reset-password-success', {userType});
} catch (error) {
logger.error(`PasswordResetController - Process reset error: ${error.message}`);
res.render('auth/reset-password-form', {
token: req.body.token,
userType: req.body.userType,
error: error.message
});
}
}
export {
va_request_password_reset,
client_request_password_reset,
render_reset_form,
process_reset
};