Skip to content
Snippets Groups Projects
memberService.js 1.66 KiB
const User = require('../models/user');
const FcmToken = require('../models/fcmToken');
const ChatRooms = require('../schemas/chatRooms');

class MemberService {
  async registerToken(email, fcmToken) {
    console.log(`Registering FCM token for email: ${email}, token: ${fcmToken}`);

    // 1. RDB에서 사용자 검색
    const user = await User.findOne({ where: { email } });
    if (!user) throw new Error('User not found');

    console.log(`User found: ${user.name}`);

    // 2. RDB의 FcmTokens 테이블에 저장
    const existingToken = await FcmToken.findOne({
      where: { userId: user.id, token: fcmToken },
    });

    if (!existingToken) {
      await FcmToken.create({ userId: user.id, token: fcmToken });
      console.log(`FCM token ${fcmToken} saved to FcmTokens table`);
    } else {
      console.log(`FCM token ${fcmToken} already exists for user ${user.name}`);
    }

    // 3. MongoDB에서 관련 채팅방의 FCM 토큰 업데이트
    const existingChatRooms = await ChatRooms.find({ "participants.name": user.name });
    for (const room of existingChatRooms) {
      room.participants = room.participants.map((participant) => {
        if (participant.name === user.name) {
          const currentFcmTokens = participant.fcmTokens || [];
          if (!currentFcmTokens.includes(fcmToken)) {
            participant.fcmTokens = Array.from(new Set([...currentFcmTokens, fcmToken]));
          }
        }
        return participant;
      });
      await room.save();
    }

    console.log(`FCM token registration process completed for email: ${email}`);
    return { message: 'FCM token registered successfully' };
  }
}

module.exports = new MemberService();