diff --git a/src/index.js b/src/index.js index 4467c92..c30c8b2 100644 --- a/src/index.js +++ b/src/index.js @@ -34,24 +34,6 @@ mongoose app.use(cors()); app.use(bodyParser.json()); -// Socket.IO 이벤트 처리 -io.on('connection', (socket) => { - console.log(`클라이언트 연결됨: ${socket.id}`); - - // 클라이언트로부터 메시지 수신 - socket.on('message', (data) => { - console.log('받은 메시지:', data); - - // 연결된 모든 클라이언트에게 메시지 브로드캐스트 - io.emit('message', data); - }); - - // 클라이언트 연결 종료 처리 - socket.on('disconnect', () => { - console.log(`클라이언트 연결 해제: ${socket.id}`); - }); -}); - // Routes const homeRoutes = require('./routes/home'); const authRoutes = require('./routes/auth'); @@ -75,6 +57,9 @@ const shopRoutes = require('./routes/shop'); const payment = require('./routes/payment'); const currency = require('./routes/currencies'); const compaign = require('./routes/compaign'); +const chatRoutes = require('./routes/chat'); +const ChatMessage = require('./models/ChatMessage'); + app.use('/v1', homeRoutes); app.use('/v1', authRoutes); @@ -98,6 +83,87 @@ app.use('/v1', shopRoutes); app.use('/v1', payment); app.use('/v1', currency); app.use('/v1', compaign); +app.use('/v1/chat', chatRoutes); + + +// io.on('connection', (socket) => { +// console.log(`클라이언트 연결됨: ${socket.id}`); + +// // 클라이언트로부터 메시지 수신 +// socket.on('message', async (data) => { +// console.log('받은 메시지:', data); + +// // MongoDB에 메시지 저장 +// const newMessage = new ChatMessage({ +// username: data.username, +// message: data.message, +// }); + +// try { +// await newMessage.save(); +// // 연결된 모든 클라이언트에게 메시지 브로드캐스트 +// io.emit('message', newMessage); +// } catch (error) { +// console.error('메시지 저장 중 오류:', error); +// } +// }); + +// // 클라이언트 연결 종료 처리 +// socket.on('disconnect', () => { +// console.log(`클라이언트 연결 해제: ${socket.id}`); +// }); +// }); + + +io.on('connection', (socket) => { + console.log(`클라이언트 연결됨: ${socket.id}`); + + // 사용자 방 참여 + socket.on('join', (email) => { + console.log(`${email} joined room: ${email}`); + socket.join(email); // 사용자를 이메일 기반으로 방에 참여시킴 + }); + + // 클라이언트로부터 메시지 수신 + socket.on('message', async (data) => { + const { username, message, targetEmail } = data; + console.log(`받은 메시지: ${message} (보낸 사람: ${username}, 대상: ${targetEmail || '모든 관리자'})`); + + // MongoDB에 메시지 저장 + const newMessage = new ChatMessage({ + username, + message, + timestamp: new Date(), + }); + + try { + await newMessage.save(); + + // 메시지 대상에 따라 브로드캐스트 + if (targetEmail) { + // 특정 대상에게만 전송 + io.to(targetEmail).emit('message', { username, message, timestamp: new Date() }); + } else { + // 관리자에게 전송 (관리자 방은 'admin') + io.to('admin').emit('message', { username, message, timestamp: new Date() }); + } + } catch (error) { + console.error('메시지 저장 중 오류:', error); + } + }); + + // 관리자 방 참여 (관리자는 'admin' 방에 참가) + socket.on('joinAdmin', () => { + console.log(`관리자가 방에 참여함: ${socket.id}`); + socket.join('admin'); // 관리자는 'admin' 방에 참여 + }); + + // 클라이언트 연결 종료 처리 + socket.on('disconnect', () => { + console.log(`클라이언트 연결 해제: ${socket.id}`); + }); +}); + // GET API app.get('/v1', (req, res) => { diff --git a/src/models/ChatMessage.js b/src/models/ChatMessage.js new file mode 100644 index 0000000..a00fc85 --- /dev/null +++ b/src/models/ChatMessage.js @@ -0,0 +1,9 @@ +const mongoose = require('mongoose'); + +const ChatMessageSchema = new mongoose.Schema({ + username: { type: String, required: true }, + message: { type: String, required: true }, + timestamp: { type: Date, default: Date.now }, +}); + +module.exports = mongoose.model('ChatMessage', ChatMessageSchema); diff --git a/src/routes/chat.js b/src/routes/chat.js new file mode 100644 index 0000000..54e33c8 --- /dev/null +++ b/src/routes/chat.js @@ -0,0 +1,39 @@ +const express = require('express'); +const ChatMessage = require('../models/ChatMessage'); + +const router = express.Router(); + +router.get('/messages', async (req, res) => { + try { + const { email } = req.query; + + if (!email) { + return res.status(400).json({ success: false, message: 'Email parameter is required.' }); + } + + // 이메일 배열로 필터링 + const emailArray = email.split(','); + const messages = await ChatMessage.find({ username: { $in: emailArray } }).sort({ timestamp: 1 }); + + res.json(messages); + } catch (error) { + res.status(500).json({ success: false, message: error.message }); + } +}); + +// Fetch all chat messages for admin +router.get('/admin/messages', async (req, res) => { + try { + // 모든 메시지를 timestamp 순으로 정렬하여 가져오기 + const messages = await ChatMessage.find().sort({ timestamp: 1 }); + res.json(messages); + } catch (error) { + res.status(500).json({ success: false, message: error.message }); + } +}); + + + +module.exports = router; + +