다른 채팅어플과는 달리 여기서는 상대방에게 message를 보내면 자동적으로 Room이 생성됨
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가 아니기 떄문에 ! 를 생략함.
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,
}
}
),
},
}