feat: add email notification functionality to the notifications service by integrating EmailModule and EmailService.

This commit is contained in:
pradeepkumar
2026-03-19 17:15:09 +05:30
parent fcf90e8638
commit 7736917c96
2 changed files with 50 additions and 5 deletions

View File

@@ -2,9 +2,10 @@ import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { NotificationsService } from './notifications.service';
import { NotificationsController } from './notifications.controller';
import { EmailModule } from '../email';
@Module({
imports: [ConfigModule],
imports: [ConfigModule, EmailModule],
controllers: [NotificationsController],
providers: [NotificationsService],
exports: [NotificationsService],

View File

@@ -6,6 +6,7 @@ import * as admin from 'firebase-admin';
import * as fs from 'fs';
import * as path from 'path';
import { PrismaService } from '../prisma/prisma.service';
import { EmailService } from '../email/email.service';
interface FcmToken {
token: string;
@@ -27,6 +28,7 @@ export class NotificationsService implements OnModuleInit {
constructor(
private readonly prisma: PrismaService,
private readonly configService: ConfigService,
private readonly emailService: EmailService,
) {}
onModuleInit() {
@@ -221,18 +223,19 @@ export class NotificationsService implements OnModuleInit {
actionUrl?: string,
data?: Record<string, string>,
) {
// Check user notification preferences for inApp
// Check user notification preferences
const user = await this.prisma.user.findUnique({
where: { id: userId },
select: { notificationPreferences: true, fcmTokens: true },
select: { notificationPreferences: true, fcmTokens: true, email: true },
});
if (!user) return;
const prefs = user.notificationPreferences as Record<string, any> | null;
const inAppEnabled = prefs?.notifications?.[category]?.inApp !== false;
const emailEnabled = prefs?.notifications?.[category]?.email === true;
// Always persist the in-app notification (if enabled)
// Persist in-app notification (if enabled)
if (inAppEnabled) {
await this.prisma.notification.create({
data: {
@@ -246,7 +249,7 @@ export class NotificationsService implements OnModuleInit {
});
}
// Send push notification (if Firebase configured and user has tokens)
// Send push notification via FCM (if enabled and user has tokens)
if (inAppEnabled) {
await this.sendPushNotification(userId, user, {
title,
@@ -254,6 +257,47 @@ export class NotificationsService implements OnModuleInit {
data,
});
}
// Send email notification (if email preference enabled)
if (emailEnabled && user.email) {
await this.sendEmailNotification(user.email, title, description, actionUrl);
}
}
private async sendEmailNotification(
email: string,
title: string,
body: string,
actionUrl?: string,
): Promise<void> {
try {
const frontendUrl = this.configService.get<string>('app.frontendUrl') || 'http://localhost:3000';
const fullUrl = actionUrl ? `${frontendUrl}${actionUrl}` : frontendUrl;
await this.emailService.sendEmail({
to: email,
subject: title,
html: `
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
<div style="background-color: #00293d; padding: 20px; text-align: center;">
<h1 style="color: white; margin: 0; font-size: 20px;">RE-Quest</h1>
</div>
<div style="padding: 30px 20px;">
<h2 style="color: #00293d; font-size: 18px; margin-top: 0;">${title}</h2>
<p style="color: #333; font-size: 14px; line-height: 1.6;">${body}</p>
${actionUrl ? `<a href="${fullUrl}" style="display: inline-block; background-color: #e58625; color: white; padding: 12px 24px; text-decoration: none; border-radius: 15px; font-weight: bold; margin-top: 15px;">View Details</a>` : ''}
</div>
<div style="background-color: #f5f5f5; padding: 15px 20px; text-align: center; font-size: 12px; color: #666;">
<p>You received this email because of your notification settings on RE-Quest.</p>
<a href="${frontendUrl}/agent/settings/notifications" style="color: #e58625;">Manage notification preferences</a>
</div>
</div>
`,
text: `${title}\n\n${body}\n\n${actionUrl ? `View details: ${fullUrl}` : ''}`,
});
} catch (error) {
this.logger.error(`Failed to send email notification to ${email}: ${error.message}`);
}
}
private async sendPushNotification(