티스토리 뷰

안녕하세요 강정호 입니다

 

오늘 개발할 API는 내 프로필 보기(me)와 seeFullPost API입니다.

 

me.graphql

type Query {
    me: UserProfile!
}

me.graphql에서는 Query 작업으로 UserProfile 객체를 조회한다.

응? 근데 UserProfile이라는 객체는 존재하지 않는데 이것은 무엇이지 라고 생각할 수 있다.

UserProfile은 개발자가 직접 만든 조회용 객체이다.

 

아래 model.grapql에서 보면 UserProfile 타입은 User객체와 Post 배열을 포함하는 타입의 객체이다.

이번 포스팅의 핵심!!

Prisma에서는 하나의 데이터 타입과 연결된 하위 데이터들을 가져올 수 없는 한계가 있다.

Query에 리턴타입을 User! 설정 ==> User 타입 객체만 조회

Query에 리턴타입 User, [Post!]! 설정 ==> User와 Post 객체 모두 조회 가능

 

이 때문에 model에 UserProfile 타입을 선언했다.

model.graphql

type User {
  id: ID!
  userName: String!
  email: String!
  firstName: String
  lastName: String
  fullName: String
  amIFollowing: Boolean!
  bio: String
  following: [User!]!
  followers: [User!]!
  posts: [Post!]!
  likes: [Like!]!
  comments: [Comment!]!
  rooms: [Room!]!
}

type Post{
  id: ID!
  location: String
  caption: String!
  user: User!
  files:[File!]!
  likes: [Like!]!
  comments: [Comment!]!
  isLiked: Boolean!
}

type Like{
  id: ID!
  user: User!
  post: Post!
}

type Comment{
  id: ID!
  text: String!
  user: User!
}

type File{
  id: ID!
  url: String!
  post: Post!
}

type Room{
  id: ID!
  participants: [User!]!
  messages: [Message!]!
}

type Message{
  id: ID!
  text: String! 
  from: User!
  to: User!
}

type UserProfile {
  user: User
  posts: [Post!]!
}

 

me.js

import { prisma } from "../../../../generated/prisma-client";

export default {
    Query: {
        me: async (_, __, { request, isAuthenticated }) => {
            isAuthenticated(request);
            const { user } = request;
            const userProfile = await prisma.user({id: user.id});
            const posts = await prisma.user({id: user.id}).posts();
            return {
                user: userProfile,
                posts
            }
            
        }
    },
    User: {
        fullName: (parent) => {
            return `${parent.firstName} ${parent.lastName}`
        }
    }
};

 

테스트

위와 같이 me Query를 실행하면 User와 User에 달린 Post 배열이 정상적으로 리턴이 된다.

 

 

 

seeFullPost.graphql

type FullPost {
  post: Post!
  comments: [Comment!]!
  likeCount: Int
}

type Query {
  seeFullPost(id: String!): FullPost!
}

seeFullPost는 Query(조회) 작업이다. FullPost 객체를 리턴을 하는데, FullPost 타입은 post, comments, likeCount를 리턴한다.

위와 같이 새롭게 타입을 생성해서 리턴 타입을 설정할 수 있다.

 

 

seeFullPost.js

import { prisma } from "../../../../generated/prisma-client";
import { COMMENT_FRAGMENT } from "../../../fragments";

export default {
    Query: {
        seeFullPost: async(_, args) => {
            const { id } = args;
            const post  = await prisma.post({id});
            const comments = await prisma.post({id}).comments().$fragment(COMMENT_FRAGMENT);
            const likeCount = await prisma.likesConnection({
                where: { post: {id} }
            })
            .aggregate()
            .count();

            return {
                post, comments, likeCount
            }

        }
    }
}

 

테스트

Post Id를 사용하여 해당 Post를 조회하고, 거기에 딸린 Comment와 likeCount를 정상적으로 조회하는 것을 확인할 수 있습니다.

댓글