31. sendMessage

김종민·2022년 4월 29일
0

insta-backend

목록 보기
31/37

다른 채팅어플과는 달리 여기서는 상대방에게 message를 보내면 자동적으로 Room이 생성됨

1. sendMessage.typeDefs.js

import { gql } from "apollo-server";

export default gql`
    type sendMessageResult{
        ok: Boolean!
        error: String
    }

    type Mutation{
        sendMessage(payload: String!, roomId: Int, userId: Int) : sendMessageResult!
    }
`

roomId와 userId는 required가 아니기 떄문에 ! 를 생략함.

2. sendMessage.resolvers.js

import prisma from '../../client'
import { NEW_MESSAGE } from '../../constants'
import pubsub from '../../pubsub'
import { protectedResolver } from '../../users/users.util'

export default {
  Mutation: {
    sendMessage: protectedResolver(
      async (_, { payload, roomId, userId }, { loggedInUser }) => {
        let room = null
        ///room은 DM을 보내면 create되기 떄문에 일단, let room = null로 만듬.
        
        if (userId) {
          const user = await prisma.user.findUnique({
            where: { id: userId },
            select: { id: true },
          })
          ///userId를 arg로 받았다면 user에서 userId로 user를 찾음.
          
          if (!user) {
            return {
              ok: false,
              error: 'This User does not exist',
            }
          }
          ///user가 없으면 ok: false를 return함.
          
          room = await prisma.room.create({
            data: {
              users: { connect: [{ id: userId }, { id: loggedInUser.id }] },
            },
          })
          ///마지막으로 room을 만들어줌.
          ///data에 userId와 loggedInUser를 users 연결해줌.
          ///여기서 내(loggedInUser.id)가 송혜교(userId)에게 DM을 보낸다고 생각하면 됨.
          
          
        } else if (roomId) {
        ///args로 roomId를 받았을 경우!!
        
          room = await prisma.room.findUnique({
            where: { id: roomId },
            select: { id: true },
          })
          ///roomId로 room을 찾음.
          
          if (!room) {
            return {
              ok: false,
              error: 'Room not found',
            }
          }
        }
        ///if 문이 끝나고 나면
        ///if(userId) 혹은 if(roomId) 두 경우 모두 해당되게
        ///if 문이 끝난 후에 message를 create해줌.
   	
        const message = await prisma.message.create({
        ///message를 만들어줌.
        ///data에 payload를 넣어주고, room과 user를 connect해줌.
        
          data: {
            payload,
            room: {
              connect: {
                id: room.id,
              },
            },
            user: {
              connect: {
                id: loggedInUser.id,
              },
            },
          },
        })
        
        ///subscribe 부분..
        /// roomUpdates라는 subscribe Fn에 위에서만든 message를 publish해줌.
        ///NEW_MESSAGE는 subscribe와 publish의 key라고 생각하면 됨.
        
        pubsub.publish(NEW_MESSAGE, { roomUpdates: message })
        
        ///모든 과정이 순조롭게 끝나면 ok:true를 return해줌.
        return {
          ok: true,
        }
      }
    ),
  },
}
profile
코딩하는초딩쌤

0개의 댓글