mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2026-03-10 18:31:46 +00:00
- Add FCM token registration during login/signup - Implement transaction notification listeners - Add notification data column to database - Update Firebase service with data payload support - Add transaction notification scopes - Update card repository to load relations for notifications
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { Injectable, Logger } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import * as admin from 'firebase-admin';
|
|
|
|
@Injectable()
|
|
export class FirebaseService {
|
|
private readonly logger = new Logger(FirebaseService.name);
|
|
|
|
constructor(private readonly configService: ConfigService) {
|
|
try {
|
|
this.logger.log('🔥 Initializing Firebase Admin SDK...');
|
|
|
|
const projectId = this.configService.get('FIREBASE_PROJECT_ID');
|
|
const clientEmail = this.configService.get('FIREBASE_CLIENT_EMAIL');
|
|
const privateKey = this.configService.get('FIREBASE_PRIVATE_KEY');
|
|
|
|
// Log configuration (without exposing sensitive data)
|
|
this.logger.log(`📋 Project ID: ${projectId}`);
|
|
this.logger.log(`📋 Client Email: ${clientEmail}`);
|
|
this.logger.log(`📋 Private Key: ${privateKey ? 'SET ✅' : 'MISSING ❌'}`);
|
|
|
|
admin.initializeApp({
|
|
credential: admin.credential.cert({
|
|
projectId,
|
|
clientEmail,
|
|
privateKey: privateKey.replace(/\\n/g, '\n'),
|
|
}),
|
|
});
|
|
|
|
this.logger.log('✅ Firebase Admin SDK initialized successfully!');
|
|
this.logger.log(`📱 Connected to project: ${projectId}`);
|
|
} catch (error: any) {
|
|
this.logger.error('❌ Failed to initialize Firebase Admin SDK');
|
|
this.logger.error(`Error: ${error.message}`);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async sendNotification(tokens: string | string[], title: string, body: string, data?: Record<string, string>) {
|
|
this.logger.log(
|
|
`Sending push notification to ${Array.isArray(tokens) ? tokens.length : 1} device(s)`,
|
|
);
|
|
|
|
try {
|
|
const message = {
|
|
notification: {
|
|
title,
|
|
body,
|
|
},
|
|
data: data || {},
|
|
tokens: Array.isArray(tokens) ? tokens : [tokens],
|
|
};
|
|
|
|
const response = await admin.messaging().sendEachForMulticast(message);
|
|
|
|
this.logger.log(
|
|
`✅ Push sent! Success: ${response.successCount}, Failed: ${response.failureCount}`,
|
|
);
|
|
|
|
// Log failed tokens for debugging
|
|
if (response.failureCount > 0) {
|
|
response.responses.forEach((resp, idx) => {
|
|
if (!resp.success) {
|
|
this.logger.warn(
|
|
`Failed to send to token ${idx}: ${resp.error?.code} - ${resp.error?.message}`,
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
return response;
|
|
} catch (error: any) {
|
|
this.logger.error(`❌ Failed to send push notification: ${error.message}`);
|
|
throw error;
|
|
}
|
|
}
|
|
}
|