functions/index.js
// functions/index.js
const { onDocumentCreated } = require('firebase-functions/v2/firestore');
const logger = require("firebase-functions/logger");
const admin = require('firebase-admin');
// Initialize Firebase Admin
admin.initializeApp();
// Reference to Firestore
const db = admin.firestore();
// 마이로그를 쓰면 구독자에게 알림을 전송한다.
exports.sendNewMylogNotification = onDocumentCreated('/mylogs/{mylogId}', async (event) => {
const snapshot = event.data;
if (!snapshot) {
console.log("No data associated with the event");
return;
}
const data = snapshot.data();
// access a particular field as you would any JS property
const authorId = data.userId;
const title = data.title;
const content = data.content;
try {
// userId는 저자이다. 저자의 독자들을 가져와야 한다.
// subscriptions 컬렉션의 구조: userId: userId, authorId: authorId, createdAt: new Date(),
const readersSnapshot = await db.collection('subscriptions')
.where('authorId', '==', authorId) // Query for posts where 'authorId' matches
.get();
const readerIds = [];
readersSnapshot.forEach((doc) => {
readerIds.push(doc.data().userId);
});
// readerIds 에 userId가 있는 모든 독자에게 알림 전송
for (const userId of readerIds) {
// 각 회원의 토큰을 가져온다.
const tokenSnapshot = await admin.firestore().collection('fcmTokens').doc(userId).get();
// 토근이 있으면 알림을 전송한다.
if (tokenSnapshot.exists) {
// 한 회원이 여러 토큰을 가진다. PC, 모바일 등
const tokens = tokenSnapshot.data().tokens;
console.log('tokens: ', tokens);
// Token을 배열에 넣는다.
const fcmTokens = [];
tokens.forEach((token) => {
// doc.data() is never undefined for query doc snapshots
fcmTokens.push(token.token);
});
try {
const response = await admin.messaging().sendEachForMulticast({
tokens: fcmTokens,
notification: {
title: title,
body: content,
}
});
// Check the results of the notifications
response.responses.forEach((response, idx) => {
if (response.success) {
console.log(`Message sent successfully to token: ${fcmTokens[idx]}`);
} else {
console.error(`Failed to send message to token: ${fcmTokens[idx]}`, response.error);
}
});
//return res.status(200).send('Notification sent successfully');
} catch (error) {
console.error('Error sending multicast notifications:', error);
}
}
}
} catch (error) {
console.error('Error getting readers:', error);
//res.status(500).send('Error getting readers');
}
});