DEV Community

Philip Daudu
Philip Daudu

Posted on

Push Notification with Firebase + Nestjs

Firebase Push Notification Implementation

Overview

This document describes the integration and implementation of Firebase Cloud Messaging (FCM) push notifications within the backend service, built using NestJS. The system enables real-time and asynchronous notifications to users’ devices (web, Android, iOS) for various events, such as appointment updates, test assignments, and order status changes.


1. Firebase Setup

  • Firebase Project: A Firebase project is created in the Firebase Console.
  • Service Account: The backend uses a service account JSON file (firebase-service-account.json) for server authentication.
  • FCM Configuration: The Firebase Admin SDK is initialized in the backend using the service account credentials.
// backend/src/config/firebase.config.ts
import * as admin from 'firebase-admin';
import * as serviceAccount from '../../firebase-service-account.json';

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount as admin.ServiceAccount),
});

export const messaging = admin.messaging();
Enter fullscreen mode Exit fullscreen mode

2. User FCM Token Management

  • Saving FCM Token: When a user logs in or registers a device, the frontend sends the FCM token to the backend, which stores it in the user’s record.
  • Deleting FCM Token: On logout or device removal, the token is deleted from the user’s record.
// backend/src/notification/notification.service.ts
async saveFcmToken(userId: string, token: string) { ... }
async deleteFcmToken(userId: string) { ... }
Enter fullscreen mode Exit fullscreen mode

3. Sending Push Notifications

  • Notification Service: The NotificationService contains the logic for sending FCM notifications.
  • sendFcmNotification Method: This method retrieves the user’s FCM token and sends a notification using the Firebase Admin SDK.
async sendFcmNotification(userId: string, title: string, body: string, data?: any) {
  const user = await this.usersRepository.findOne({ where: { id: userId } });
  if (!user || !user.fcmToken) return null;

  const message = {
    token: user.fcmToken,
    notification: { title, body },
    data: { ...data, click_action: 'FLUTTER_NOTIFICATION_CLICK', sound: 'default' },
    android: { ... },
    apns: { ... },
    webpush: { ... },
  };

  return await messaging.send(message);
}
Enter fullscreen mode Exit fullscreen mode
  • Trigger Points: Notifications are sent for various events, such as:
    • Appointment creation, rescheduling, or cancellation
    • Test assignments to technicians or marketers
    • Test result availability
    • Order status updates

4. Notification Creation and Storage

  • Database Storage: Every notification is stored in the Notification entity, which includes fields such as title, message, type, referenceId, and user.
  • WebSocket Real-Time Notification: In addition to FCM, notifications are also sent via WebSocket for real-time updates in the frontend.
async createNotification(data: { ... }) {
  const notification = this.notificationRepository.create({ ... });
  const savedNotification = await this.notificationRepository.save(notification);

  // WebSocket
  this.notificationGateway.sendNotification(data.userId, savedNotification);

  // FCM
  await this.sendFcmNotification(data.userId, data.title, data.message, { ... });
}
Enter fullscreen mode Exit fullscreen mode

5. Notification Data Structure

  • Frontend Format: Notifications are mapped to a frontend-friendly structure, including:
    • create_time
    • description
    • reference_id
    • is_viewed
    • name
    • notification_type
    • update_time
    • user_id
    • uuid

6. Extensibility

  • Bulk Notifications: The system supports sending notifications to multiple users at once.
  • Role-Based Notifications: Different notification types and messages are sent based on user roles (e.g., technician, marketer, coordinator).

7. Error Handling and Logging

  • All FCM errors are logged but do not interrupt the main application flow.
  • Internal server errors are handled gracefully and reported for debugging.

8. Security Considerations

  • FCM tokens are stored securely and only accessible to authenticated backend services.
  • Only authorized users can trigger notification events.

Conclusion

This implementation provides a robust, scalable, and extensible push notification system using Firebase Cloud Messaging, integrated seamlessly with the backend’s business logic and user management. It ensures users are kept up-to-date in real time, improving engagement and operational efficiency.

Top comments (0)