const EmailClient = require("../core/EmailClient"); const TemplateManager = require("../core/TemplateManager"); /** * AuthEmailService handles all authentication and account security related emails * This service is responsible for: * - Sending email verification links * - Sending password reset links * - Sending password changed confirmations */ class AuthEmailService { constructor() { this.emailClient = new EmailClient(); this.templateManager = new TemplateManager(); this.initialized = false; } /** * Initialize the auth email service * @returns {Promise} */ async initialize() { if (this.initialized) return; await Promise.all([ this.emailClient.initialize(), this.templateManager.initialize(), ]); this.initialized = true; console.log("Auth Email Service initialized successfully"); } /** * Send email verification email to new users * @param {Object} user - User object * @param {string} user.firstName - User's first name * @param {string} user.email - User's email address * @param {string} verificationToken - Email verification token * @returns {Promise<{success: boolean, messageId?: string, error?: string}>} */ async sendVerificationEmail(user, verificationToken) { if (!this.initialized) { await this.initialize(); } const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000"; const verificationUrl = `${frontendUrl}/verify-email?token=${verificationToken}`; const variables = { recipientName: user.firstName || "there", verificationUrl: verificationUrl, }; const htmlContent = await this.templateManager.renderTemplate( "emailVerificationToUser", variables ); return await this.emailClient.sendEmail( user.email, "Verify Your Email - RentAll", htmlContent ); } /** * Send password reset email with reset link * @param {Object} user - User object * @param {string} user.firstName - User's first name * @param {string} user.email - User's email address * @param {string} resetToken - Password reset token * @returns {Promise<{success: boolean, messageId?: string, error?: string}>} */ async sendPasswordResetEmail(user, resetToken) { if (!this.initialized) { await this.initialize(); } const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000"; const resetUrl = `${frontendUrl}/reset-password?token=${resetToken}`; const variables = { recipientName: user.firstName || "there", resetUrl: resetUrl, }; const htmlContent = await this.templateManager.renderTemplate( "passwordResetToUser", variables ); return await this.emailClient.sendEmail( user.email, "Reset Your Password - RentAll", htmlContent ); } /** * Send password changed confirmation email * @param {Object} user - User object * @param {string} user.firstName - User's first name * @param {string} user.email - User's email address * @returns {Promise<{success: boolean, messageId?: string, error?: string}>} */ async sendPasswordChangedEmail(user) { if (!this.initialized) { await this.initialize(); } const timestamp = new Date().toLocaleString("en-US", { dateStyle: "long", timeStyle: "short", }); const variables = { recipientName: user.firstName || "there", email: user.email, timestamp: timestamp, }; const htmlContent = await this.templateManager.renderTemplate( "passwordChangedToUser", variables ); return await this.emailClient.sendEmail( user.email, "Password Changed Successfully - RentAll", htmlContent ); } } module.exports = AuthEmailService;