티스토리 뷰
안녕하세요 강정호입니다
오늘은 seeRoom Resolver를 개발해보겠습니다
seeRoom 쿼리는 Room id를 인자로 하여 채팅방의 참여자, 메시지들을 조회하는 쿼리입니다.
seeRoom.graphql
type Query {
seeRoom(id: String!): Room!
}
fragments.js
export const USER_FRAGMENT = `
id
userName
avatar
`;
export const COMMENT_FRAGMENT = `
id
text
user {
${USER_FRAGMENT}
}
`;
export const FILE_FRAGMENT = `
id
url
`;
export const FULL_POST_FRAGMENT = `
fragment PostParts on Post {
id
location
caption
user {
${USER_FRAGMENT}
}
files {
${FILE_FRAGMENT}
}
comments {
${COMMENT_FRAGMENT}
}
}
`;
export const MESSAGE_FRAGMENT = `
fragment MessageParts on Message{
id
text
to {
${USER_FRAGMENT}
}
from {
${USER_FRAGMENT}
}
}
`;
export const ROOM_FRAGMENT = `
fragment RoomParts on Room{
id
participants {
${USER_FRAGMENT}
}
messages {
${MESSAGE_FRAGMENT}
}
}
`;
fragment는 Graphql 쿼리 상에서 많은 컬럼들을 조회할 때 유용하게 사용할 수 있다. 예를 들면 미리 fragment에 조회할 컬럼들을 지정한 후에 $fragment API를 사용하여 미리 작성해둔 컬럼들만 조회할 수 있다. 아래는 prisma 공식 doc에 있는 fragment에 대한 내용이다.
위와 같이 ROOM_FRAGMENT를 사용하여 미리 조회할 컬럼들을 작성할 수도 있고, fragment끼리 결합할 수 도 있다. 재사용성이 높고 코드가 간결해진다는 장점이 있다.
seeRoom.js
import { prisma } from "../../../../generated/prisma-client";
import { ROOM_FRAGMENT, USER_FRAGMENT } from "../../../fragments";
export default {
Query: {
seeRoom: async (parent, args, { request, isAuthenticated }, info) => {
isAuthenticated(request);
const { user } = request;
const { id } = args;
// Room 중에서 해당 User의 아이디가 참여자로 있는 방이 있다면 존재여부를 canSee로 반환
const canSee = await prisma.$exists.room({
participants_some:{
id: user.id
}
});
// User의 아이디가 참여한 방이 있다면 해당 Room을 조회한다.
if(canSee){
const room = await prisma.room({id}).$fragment(ROOM_FRAGMENT);
return room;
}else{
throw Error("You can't see this");
}
}
}
}
canSee는 Room 중에서 사용자 본인이 포함된 room이 있는지 확인하는 것이다.
그리고 나서 존재한다면 room id를 사용해서 room을 조회한다.
이것에 맹점이 있다고 생각하는데, 내가 포함된 room이어도, room을 id로 조회할 때 내가 없는 방일 수도 있는데 그런 경우는 어떻게 처리하는가?
Graphql의 relation 관련 문서 : docs.fauna.com/fauna/current/api/graphql/relations
'프로젝트' 카테고리의 다른 글
[인스타그램 클론코딩] #4.0 create-react-app cleanup and installation (0) | 2020.09.28 |
---|---|
[인스타그램 클론코딩] #3.28~#3.29 newMessage Subscription (0) | 2020.09.27 |
[인스타그램 클론코딩] #3.21 editPost deletePost Resolver (0) | 2020.09.18 |
[인스타그램 클론코딩] #3.19 upload Resolver (0) | 2020.09.14 |
[인스타그램 클론코딩] #3.16 ~ 3.18 isSelf, isFollowing, isLiked with Computed.js (0) | 2020.09.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- GIT
- 깃허브
- pop_back
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- github
- 항해솔직후기
- 항해플러스백엔드
- 항해플러스후기
- front
- 깃
- 인셉션
- 2023년
- 부동산공부
- 월부닷컴
- 내년은 빡세게!!
- Inception
- 월급쟁이부자들
- docker
- push_back
- Use case
- 폭포수
- 파라메터
- resize
- 개발자 회고
- 도커
- 열반스쿨기초반
- 재테크공부
- Spring boot
- 관계대수
- 유즈케이스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함