kgneng2 / blokg

blog
MIT License
0 stars 0 forks source link

GraphQL #26

Open kgneng2 opened 4 years ago

kgneng2 commented 4 years ago

https://graphql-kr.github.io/learn/

example

request

{
  me {
    name
  }
}

response

{
  "me": {
    "name": "Luke Skywalker"
  }
}

스키마 & 타입

type Character {
  name: String!
  appearsIn: [Episode]!
  length(unit: LengthUnit = METER): Float
}

쿼리 타입 & 뮤테이션 타입

스키마 대부분의 타입은 일반 객체 타입이지만 스키마 내에는 특수한 두 가지 타입이 있습니다.

schema { query: Query mutation: Mutation } 모든 GraphQL 서비스는 query 타입을 가지며 mutation 타입은 가질 수도 있고 가지지 않을 수도 있습니다. 이러한 타입은 일반 객체 타입과 동일하지만 모든 GraphQL 쿼리의 진입점(entry point) 을 정의하므로 특별합니다.

query {
  hero {
    name
  }
  droid(id: "2000") {
    name
  }
}
-----
{
  "data": {
    "hero": {
      "name": "R2-D2"
    },
    "droid": {
      "name": "C-3PO"
    }
  }
}

즉, GraphQL 서비스는 hero 및 droid 필드가 있는 Query 타입이 있어야합니다.

type Query {
  hero(episode: Episode): Character
  droid(id: ID!): Droid
}

스칼라 타입

열거형 타입

enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
}

즉, 스키마에서 Episode 타입을 사용할 때마다 정확히 NEWHOPE, EMPIRE, JEDI 중 하나일 것입니다.

다양한 언어로 작성된 GraphQL 서비스 구현은 열거형 타입을 처리 할 수 있는 언어별 고유한 방법을 갖습니다. enum 을 지원하는 언어에서는 구현시 이를 활용할 수 있습니다. 열거형 타입이 없는 JavaScript와 같은 언어에서 이러한 값은 내부적으로 정수 집합에 매핑될 수 있습니다. 하지만 이러한 세부 정보는 클라이언트에 노출되지 않으며, 열거형 값의 문자열로만 작동합니다.

interface

interface Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}
---
type Human implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  starships: [Starship]
  totalCredits: Int
}

type Droid implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  primaryFunction: String
}

특정 객체 타입의 필드를 요청하려면 인라인 프래그먼트을 사용해야합니다.

query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ... on Droid {
      primaryFunction
    }
  }
}
query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ... on Droid {
      primaryFunction
    }
  }
}
{
  "ep": "JEDI"
}
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "primaryFunction": "Astromech"
    }
  }
}
kgneng2 commented 4 years ago

node request 를 이용한 graphql 호출 방법

'user strict'

request = require 'request'
config = require '../../config/environment'
UTIL = require '../util/useful.util'
logger = require('log4js').getLogger()

getFlightCalendarFare = (reqQuery, callback) ->
  roundTripTime = if reqQuery.roundTripTime then parseInt(reqQuery.roundTripTime, 10) else NaN

  variable = Object.assign reqQuery,
    hoursBefore: parseInt(reqQuery.hoursBefore, 10)
    roundTripTime: roundTripTime
    agent: parseInt(reqQuery.agent, 10)

  body =
    operationName: 'flight_calendar_fare'
    query: 'query flight_calendar_fare(
      $from: [String!]!
      $to: String!
      $mode: String!
      $departDate: String!
      $hoursBefore: Int!
      $roundTripTime: Int
      $agent: Int!
    ) {
        flightFare(
          from: $from,
          to: $to,
          mode: $mode,
          departDate: $departDate,
          hoursBefore: $hoursBefore,
          roundTripTime: $roundTripTime,
          agent: $agent
        ) {
          date
          fares {
            stops
            fare
          }
        }
      }
    '
    variables: variable

  UTIL.sendGraphQL(body, callback, true)

module.exports.index = (req, res) ->
  getFlightCalendarFare req.query, (err, result) =>
    if err
      logger.error err
      res.status(500).send(err)
    else
      logger.info result.data.flightFare
      res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate')
      res.header('Expires', '-1')
      res.header('Pragma', 'no-cache')
      res.json result.data.flightFare

baseOptionsForClearance =
  uri: config.travelApiWorkSpace.domain + '/graphql'
  method: 'POST'
  timeout: 15000
  headers:
    'Content-Type': 'application/json'
  resolveWithFullResponse: true

baseOptionsForAirline =
  uri: config.travelApiAirline.domain + '/graphql'
  method: 'POST'
  timeout: 15000
  headers:
    'Content-Type': 'application/json'
  resolveWithFullResponse: true

module.exports.sendGraphQL = (reqBody, callback, isFlightApi, req, isAirline) ->
  sendBaseOptions = if isFlightApi then baseOptionsForClearance else baseOptions
  if isAirline
    sendBaseOptions = baseOptionsForAirline
  options = Object.assign sendBaseOptions,
    body: JSON.stringify(reqBody)
    headers: Object.assign sendBaseOptions.headers,
      'graphql-operation': reqBody.operationName
      'graphql-valiables':
        '?' +
        Object.keys(reqBody.variables)
          .map((key) => """#{key}=#{encodeURIComponent(reqBody.variables[key])}""")
          .join('&')
  if req
    options.headers['user-agent'] = req.headers['user-agent']
    options.headers['referer'] = req.headers['referer']
    options.headers['x-nx-user-agent'] = req.headers['x-nx-user-agent']
    options.headers['x-nx-session-id'] = req.headers['x-nx-session-id']
    options.headers['x-nx-page-id'] = req.headers['x-nx-page-id']
    options.headers['x-nx-referer'] = req.headers['x-nx-referer']
    options.headers.cookie = req.headers.cookie

  REQUEST options, (err, response, body) ->
    if err
      callback 'sendGraphQL('+ reqBody.operationName + ') failed, ' + err
    else if response and response.statusCode isnt 200
      callback 'sendGraphQL('+ reqBody.operationName + ') failed, statusCode:' + response.statusCode
    else if body
      callback null, JSON.parse(body)
    else
      callback 'sendGraphQL('+ reqBody.operationName + ')'

apollo client

import config from '../config/environment/config';
import {
  createHttpLink,
  ApolloClient,
  gql,
  InMemoryCache,
} from '@apollo/client/core';
import fetch from 'node-fetch';
import log from '../log/log';

const client = new ApolloClient({
  link: createHttpLink({
    uri: config.flightsBookings.partenersUrl,
    fetch,
  }),
  cache: new InMemoryCache(),
});

const getFlightsPartnersQuery = gql`
  query GetFlightPartners {
    flightPartners {
      otaId
      expName
    }
  }
`;

export const getFlightsPartnersName = async agtCode => {
  const { data } = await client.query({
    query: getFlightsPartnersQuery,
  });

  console.log(data.flightPartners.length);

  // return partners
  //   .filter(partner => partner.otaId === agtCode)
  //   .map(d => {
  //     return d.expName;
  //   });
};