const EmailClient = require("../core/EmailClient"); const TemplateManager = require("../core/TemplateManager"); const logger = require("../../../utils/logger"); /** * MessagingEmailService handles all messaging-related email notifications * This service is responsible for: * - Sending new message notifications to users */ class MessagingEmailService { constructor() { this.emailClient = new EmailClient(); this.templateManager = new TemplateManager(); this.initialized = false; } /** * Initialize the messaging email service * @returns {Promise} */ async initialize() { if (this.initialized) return; await Promise.all([ this.emailClient.initialize(), this.templateManager.initialize(), ]); this.initialized = true; logger.info("Messaging Email Service initialized successfully"); } /** * Send new message notification email * @param {Object} receiver - User object of the message receiver * @param {string} receiver.firstName - Receiver's first name * @param {string} receiver.email - Receiver's email address * @param {Object} sender - User object of the message sender * @param {string} sender.id - Sender's user ID * @param {string} sender.firstName - Sender's first name * @param {string} sender.lastName - Sender's last name * @param {Object} message - Message object * @param {string} message.content - Message content * @param {Date} message.createdAt - Message creation timestamp * @returns {Promise<{success: boolean, messageId?: string, error?: string}>} */ async sendNewMessageNotification(receiver, sender, message) { if (!this.initialized) { await this.initialize(); } try { const frontendUrl = process.env.FRONTEND_URL; const conversationUrl = `${frontendUrl}/messages/conversations/${sender.id}`; const timestamp = new Date(message.createdAt).toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short", }); const variables = { recipientName: receiver.firstName || "there", senderName: `${sender.firstName} ${sender.lastName}`.trim() || "A user", messageContent: message.content, conversationUrl: conversationUrl, timestamp: timestamp, }; const htmlContent = await this.templateManager.renderTemplate( "newMessageToUser", variables, ); const subject = `New message from ${sender.firstName} ${sender.lastName}`; const result = await this.emailClient.sendEmail( receiver.email, subject, htmlContent, ); if (result.success) { logger.info( `Message notification email sent to ${receiver.email} from ${sender.firstName} ${sender.lastName}`, ); } return result; } catch (error) { logger.error("Failed to send message notification email:", error); return { success: false, error: error.message }; } } } module.exports = MessagingEmailService;