13. computed field

김종민·2022년 4월 22일
0

insta-backend

목록 보기
12/37

1. computed Field

-->DB를 건덜이지 않으면서 data를 control하기도 하고, function을 실행하기도 함.

import { gql } from 'apollo-server'

export default gql`
  type User {
    id: Int!
    username: String!
    email: String!
    password: String!
    bio: String
    avatar: String
    createdAt: String!
    updatedAt: String!
    followers: [User]
    following: [User]
    totalFollowers: Int!
    totalFollowing: Int!
    isMe: Boolean!
    isFollowing: Boolean!
  }
`

users.typeDefs.js
totalFollowers, totalFollowing, isMe, isFollowing는
Model User에는 포함되어 있지 않음.
하지만, return User에서 사용가능함.

user.resolvers.js

import prisma from '../client'

export default {
  User: {
    totalFollowing: ({ id }) =>
      prisma.user.count({ where: { follower: { some: id } } }),
      
      ///{id}는 그동안 resolver에서 _, 즉 root로 표시되었던 부분.
      ///예를 들어 호날두 인스타에 들어갔을때, 호날두의 id가 {id}임.
      ///request의 id가 {id}임,.
      ///그래서 totalFollowing를  모든 user의 follower에서 호날두의
      ///id가 포함된 수를 counting함.
      
      
    totalFollowers: ({ id }) =>
      prisma.user.count({ where: { following: { some: { id } } } }),
      
    isMe: ({ id }, _, { loggedInUser }) => {
      if (!loggedInUser) {
        return false
      }
      return id === loggedInUser.id
    },
    ///request의 id와 현재 로그인 되어있는 loggedInUser의 아이디를
    ///비교해서 boolean으로 return함.(true, false로)
    
    isFollowing: async ({ id }, _, { loggedInUser }) => {
      if (!loggedInUser) {
        return false
      }
      const exists = await prisma.user.count({
        where: { username: loggedInUser.username, following: { some: { id } } },
      })
      return Boolean(exists)
    },
    ///loggedInUser.username의 following에 request의 id tnfmf counting함
    ///당연히 1아니면 0이겠쥬.
    ///0이면 false, 1이면 true.
  },
}

User:{
totalFollowing, totalFollowers, isMe, isFollowing}
User안에 만들어 놓고 사용함.

totalFollowing: ({id})=> prisma.user.....
totlaFollowing:({root})=>prism.user...
check!!!!!
{id}가 이해하기가 쉽지않음..

console.log(root)를 찍어보면 이해할 수 있음,

2. computed Field 적용,

1.seeProfile.resolvers.js

import prisma from '../../client'

export default {
  Query: {
    seeProfile: (_, { username }) =>
      prisma.user.findUnique({
        where: { username },
        include: {
          followers: true,
          following: true,
        },
      }),
  },
}

include는 일단 신경쓸 필요 없음.

2.seeProfile.typeDefs.js

import { gql } from "apollo-server";

export default gql`
    type Query {
        seeProfile(username:String) : User
    }
`

seeProfile Query를 샐행했을떄,

arg로 받은 username의 totalFollowing, totalFollowers를 구할 수 있음.
arg로 받은 username과 loggedInUser 이 같은지 check하는게 isMe
arg로 받은 username을 loggedInUser 가 Following하고 있는지 check하는게 isFollowing임.

이렇게 보면 root와 computed Field가 조금 이해가 더 잘될거 같음.

공부 존나게 존나게 너무너무 재밌다ㅋㅋㅋㅋ

profile
코딩하는초딩쌤

0개의 댓글