Files
rentall-app/backend/services/email/domain/MessagingEmailService.js
2026-01-21 19:00:55 -05:00

97 lines
3.0 KiB
JavaScript

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<void>}
*/
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;