messengerController,
messengerRuter를 알아본다.
const {
getFriends,
messageUploadDB,
messageGet,
ImageMessageSend,
} = require('../controller/messengerController')
const { authMiddleware } = require('../middleware/authMiddleware')
///authMiddle는 아래아래에서 설명 예정
const router = require('express').Router()
router.get('/get-friends', authMiddleware, getFriends)
///친구 불러오기 router
router.post('/send-message', authMiddleware, messageUploadDB)
///message보내고 보낸 message DB에 upload
router.get('/get-message/:id', authMiddleware, messageGet)
///message를 불러오는 router
router.post('/image-message-send', authMiddleware, ImageMessageSend)
///이미지를 보내는 router
module.exports = router
const formidable = require('formidable')
const User = require('../models/authModel')
const messageModel = require('../models/messageModel')
const fs = require('fs')
module.exports.getFriends = async (req, res) => {
const myId = req.myId
///authMiddleware에서 cookie에 담긴 token을
///decode해서 req.myId에 id를 담아줌.
///authMiddleware를 참조할 것.
try {
const friendGet = await User.find({
_id: {
$ne: myId,
},
})
///friend를 get 하는데 $ne는 monogo query로
///not equal이라는 의미로 myId와는 다른
/// id만 call한다는 뜻.
/// 아해 const filter와 같은 의미임,
//const filter = friendGet.filter((d) => d.id !== myId)
res.status(200).json({ success: true, friends: friendGet })
///return해 주는데
///success:true, friends에는 위의 friendGet을
///담아서 보내준다.
} catch {
res.status(500).json({ error: { errorMessage: 'Inter 11 Server Error' } })
///error발생시, server에서 보내고,
///redux-action에서 받는 부분을 잘 봐둘것.
}
}
module.exports.messageUploadDB = async (req, res) => {
const { senderName, receiveId, message } = req.body
const senderId = req.myId
///front에서 보낸 data는 req.body로 받고,
///myId는 authMiddleware를 통해 받는다.
///authMiddleware참조할것
try {
const insertMessage = await messageModel.create({
senderId: senderId, ///req.myId로 loggedIn한 User임.
senderName: senderName, ///front에서 받음.
receiveId: receiveId, ///front에서 받음.
message: {
text: message,
image: '',
},
///image보내는 부분은 아래에서 다룰 예정
})
res.status(201).json({
success: true,
message: insertMessage,
})
///success:true와 create한 insertMessage를 res해 준다.
} catch (error) {
res.status(500).json({
error: {
errorMessage: 'Internal Sever Error',
},
})
///error발생시, res해 주는부분.
}
}
module.exports.messageGet = async (req, res) => {
const myId = req.myId
const friendId = req.params.id
///params.id는
/// router.get('/get-message/:id', authMiddleware, messageGet)
/// 와 같이 url을 통해서 전달 되는것을, req,params로
/// 받을 수 있다.
///DB에 담긴 message를 불러 들이는데, {}부분은
///mongoDB query로 아래 // 부분을 mongo Query로
///나타낸 것이다.
try {
let getAllMessage = await messageModel.find({
$or: [
{
$and: [
{
senderId: {
$eq: myId,
},
},
{
receiveId: {
$eq: friendId,
},
},
],
},
{
$and: [
{
senderId: {
$eq: friendId,
},
},
{
receiveId: {
$eq: myId,
},
},
],
},
],
})
// getAllMessage = getAllMessage.filter(
// (m) =>
// (m.senderId === myId && m.receiveId === friendId) ||
// (m.receiveId === myId && m.senderId === friendId)
// )
///mongoQuery를 JS로 풀어쓴것.
res.status(200).json({
success: true,
message: getAllMessage,
})
///filter된 message를 message에 담아서 res해 준다.
} catch (error) {
res.status(500).json({
error: {
errorMessage: 'Internal Error',
},
})
error발생시 대처하는 부분.
}
}
module.exports.ImageMessageSend = (req, res) => {
///이미지를 front에서 받아서 처리하는 API
const senderId = req.myId
const form = formidable()
///이미지, text등 여러 종류의 data를 한번에 받을떄, 사용
form.parse(req, (err, fields, files) => {
const { senderName, receiveId, imageName } = fields
///fildes로 file외의 data를 받음.
const newPath = __dirname + `../../../frontend/public/image/${imageName}`
///file이 저장될 주소를 만들어줌.
files.image.originalFilename = imageName
///받은 file의 originalFilename을
///fields로 받은 imageName으로 바꾼다.
try {
///fs를 이용해 client에서 받은 file을 newPath에
///save한다.
fs.copyFile(files.image.filepath, newPath, async (err) => {
if (err) {
res.status(500).json({
error: {
errorMessage: 'Image upload fail',
},
})
} else {
const insertMessage = await messageModel.create({
senderId: senderId,
senderName: senderName,
receiveId: receiveId,
message: {
text: '',
image: files.image.originalFilename,
},
})
res.status(201).json({
success: true,
message: insertMessage,
})
}
})
} catch (error) {
res.status(500).json({
error: {
errorMessage: 'Internal Sever Error',
},
})
}
})
}