티스토리 뷰

안녕하세요 강정호입니다

 

오늘은 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

 

GraphQL relations

When running mutations on types that contain relationships, you can create their related documents, or influence the relationship to existing documents, in the same transaction by using the relational mutations. There are three types of relational mutation

docs.fauna.com

 

 

댓글