messengerController, messengerRouter

김종민·2022년 12월 21일
0

mern-Chat

목록 보기
5/5

messengerController,
messengerRuter를 알아본다.


1. messengerRoute.js

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

2. messengerController.js

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',
        },
      })
    }
  })
}
profile
코딩하는초딩쌤

0개의 댓글