Vue PWA mylog Source Code

functions/index.js

그랜파 개발자 2024. 11. 15. 04:46

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');
  }
});

'Vue PWA mylog Source Code' 카테고리의 다른 글

AboutView.vue  (1) 2024.11.17
App.Vue  (2) 2024.11.16
main.js  (0) 2024.11.14
firebase-messaging-sw.js  (0) 2024.11.13
store/mylogs.js  (0) 2024.11.11