Slide 1

Slide 1 text

GraphQL on Rails ॕגล, Strikingly twitter: @xjconlimii github.com/onlimii

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

GraphQL?

Slide 4

Slide 4 text

GraphQLࣁFacebook 3ଙ҅ྯॠ260Պེ᧗࿢

Slide 5

Slide 5 text

GraphQL ෬ӧฎ SQL҅Ԟӧฎᖫᑕ᧍᥺

Slide 6

Slide 6 text

GraphQLฎRESTful APIԏ क़ጱݚӞӻᭌೠ҅ࣁ຤Զఘ ٭ӥ҅ฎๅঅጱᭌೠ̶

Slide 7

Slide 7 text

RESTful APIጱᳯ᷌

Slide 8

Slide 8 text

Roundtrips /api/v1/site/:id /api/v1/site/:id/analytics ᮎ౯ݢզአᛔਧԎendpointޚѺ

Slide 9

Slide 9 text

{ “data”: { “id”: 123, “title”: “Growth…”, “permalink”: “mirandakerr”, “createdAt”: “some time”, “updatedAt”: “another time”, “picture”: “//image.png”, “description”: “…”, “notes”: “…”, “state”: “published”, “screenshot_url”: “…”, “isRetired”: false, … } } { “data”: { “id”: 123, “title”: “Growth…”, “permalink”: “mirandakerr”, “createdAt”: “some time”, “updatedAt”: “another time”, “picture”: “//image.png”, “description”: “…”, “notes”: “…”, “state”: “published”, “screenshot_url”: “…”, “isRetired”: false, … } } Data Over-fetching

Slide 10

Slide 10 text

Client Feature 1(v6) Feature 2(v6) Feature 3(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 3(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 2(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Feature 1(v6) Server Version Hell Client

Slide 11

Slide 11 text

ྯེᵱ࿢ጱݒๅ ᮷ᵱᥝݸᒒץද

Slide 12

Slide 12 text

“The REST interface is designed to be efficient for large-grain hypermedia data transfer…” - Dr Roy T Fielding, Author of REST RESTๅᭇአԭय़ᔉଶහഝ࣋ว

Slide 13

Slide 13 text

ԅԧכᦤଫአࣁӧݶጱਮಁᒒӥ҅᮷ํ๋অጱ አಁ֛ḵ҅ӧݶጱUIᦡᦇ޾ᵱ࿢੕ᛘԧ੒හഝ ํๅੜᔉଶഴګጱᵱ࿢̶

Slide 14

Slide 14 text

GraphQLฎRESTful API ԏक़ጱݚӞӻᭌೠ҅ࣁ੒ හഝํๅੜᔉଶഴګᵱ࿢ ጱ෸ײ҅ฎๅঅጱᭌೠ̶

Slide 15

Slide 15 text

{ me { name } } { “me”: { “name”: “Junchen Xia” } }

Slide 16

Slide 16 text

{ user(id: 1) { name } } ݇හփ᭓

Slide 17

Slide 17 text

{ “me”: { “name”: “Junchen Xia”, “picture”: { “height”: 300, “width”: 300, “url”: “//image.png” } } } { me { name picture(size: 300) { height width url } } } ىᔮັᧃ

Slide 18

Slide 18 text

{ “me”: { “name”: “Junchen Xia”, “smallPic”: { “height”: 50, “width”: 50, “url”: “//image.png” }, “bigPic”: { “height”: 300, “width”: 300, “url”: “//bigimage.png” } } } { me { name smallPic: picture(size: 50) { height width url } bigPic: picture(size: 300) { height width url } } } { me { name smallPic: picture(size: 50) { height width url } bigPic: picture(size: 300) { height width url } } } alias

Slide 19

Slide 19 text

{ “me”: { “name”: “Junchen Xia”, “friends”: [ { “name”: “AAA” }, { “name”: “BBB” } ] } } { me { name friends { name } } } one to many

Slide 20

Slide 20 text

{ me { name smallPic: picture(size: 50) { } bigPic: picture(size: 300) { } } } fragment pictureParam on picture { height width url } …pictureParam …pictureParam Fragment

Slide 21

Slide 21 text

च๜༷ஷ { me { name picture { height width url } } } query object field object

Slide 22

Slide 22 text

{ me { name picture { height width url } } } type Query { me: User user(id: Int): User }

Slide 23

Slide 23 text

{ me { name picture { height width url } } } type User { name: String picture(size: Int=50): Picture }

Slide 24

Slide 24 text

{ me { name picture { height width url } } } type Picture { height: Int width: Int url: String format: String }

Slide 25

Slide 25 text

{ name(user) { user.name } picture(user, {size}) { user.picture(size) } } type User { name: String picture(size: Int=50): Picture } Resolver

Slide 26

Slide 26 text

{ name(user) { user.name } picture(user, {size}) { user.picture(size) } } type User { name: String picture(size: Int=50): Picture } Resolver

Slide 27

Slide 27 text

{ name(user) { user.name } picture(user, {size}) { user.picture(size) } } type User { name: String picture(size: Int=50): Picture } Resolver

Slide 28

Slide 28 text

Server Client /api/v1/pages/1 page, V1 /api/v2/pages/1 page, V2 /api/v3/pages/3 page, V3 V1 V3 V2 V1 V3 V2 REST

Slide 29

Slide 29 text

Server Client page data V1 data V1 page data V2 data V2 page data V3 data V3 V1 V3 V2 GraphQL

Slide 30

Slide 30 text

Server Client ᔄࣳਧԎ ݢᚆ௔ හഝᥝ࿢ UI Big Picture ᭧໒ࢶ

Slide 31

Slide 31 text

ྯེᵱ࿢ጱݒๅ ӧᵱᥝݸᒒץද

Slide 32

Slide 32 text

Introspection { __schema{ types{ name fields{ name type { name } } } } } { "data": { "__schema": { "types": [ { "name": "Query", "fields": [ { "name": "user", "type": { "name": "User" } … }

Slide 33

Slide 33 text

Introspection 1.ᛔۖኞ౮API෈໩ 2.ๅᇍ᭧ጱ᧣ᦶૡٍ

Slide 34

Slide 34 text

՗ਮಁᒒᦡᦇ޾୏ݎጱ᥯ ଶڊݎ҅զአಁ֛ḵԅ໐ ஞ҅మဩᓌܔฃ౜̶

Slide 35

Slide 35 text

GraphQL Server

Slide 36

Slide 36 text

ଫአ᭦ᬋ ᔄࣳਧԎ Graphql-ruby ሿํӱۓդᎱ ? ଫአ᭦ᬋ GraphQL໐ஞ

Slide 37

Slide 37 text

ᔄࣳਧԎ 1. ਧԎಅํݢᚆጱquery 2. ਧԎಅํobject, field੒ଫጱresolver

Slide 38

Slide 38 text

DEMO

Slide 39

Slide 39 text

HOWTO 1. Ⴒے Graphiql! 2. ࣁRouteӾႲے GraphQL endpoint҅ଚਠ౮ፘଫ᭦ᬋ 3. ਧԎschema 4. ਧԎquery type 5. ਧԎbusiness objects

Slide 40

Slide 40 text

Ⴒے GraphQL endpoint class GraphqlController < ApplicationController def query render json: Schema.execute( params[:query], variables: params[:variables] || {} ) end end

Slide 41

Slide 41 text

Ⴒے GraphQL endpoint class GraphqlController < ApplicationController def query render json: Schema.execute( params[:query], variables: params[:variables] || {} ) end end

Slide 42

Slide 42 text

ਧԎschema Schema = GraphQL::Schema.new(query: QueryType)

Slide 43

Slide 43 text

ਧԎquery type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) else User.find_by(email: args['email']) end end end end

Slide 44

Slide 44 text

ਧԎ query type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) else User.find_by(email: args['email']) end end end end

Slide 45

Slide 45 text

ਧԎ query type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) else User.find_by(email: args['email']) end end end end

Slide 46

Slide 46 text

ਧԎ query type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) else User.find_by(email: args['email']) end end end end

Slide 47

Slide 47 text

ਧԎ query type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) else User.find_by(email: args['email']) end end end end

Slide 48

Slide 48 text

ਧԎ query type QueryType = GraphQL::ObjectType.define do name "Query" description "The query root for this schema" field :user do type UserType argument :email, types.String argument :id, types.ID resolve -> (obj, args, ctx) do if args['id'] User.find(args['id']) elsif args[‘email’] User.find_by(email: args['email']) end end end end

Slide 49

Slide 49 text

ਧԎ business objects UserType = GraphQL::ObjectType.define do name 'User' description 'A user' field :id, !types.ID field :name, types.String, property: :name field :email, types.String, property: :email field :picture, types.Picture, property: :picture end resolve -> (o, a, c) { o.public_send(property) }

Slide 50

Slide 50 text

ଫአ᭦ᬋ ᔄࣳਧԎ GraphQL໐ ஞ REST API

Slide 51

Slide 51 text

One more thing

Slide 52

Slide 52 text

GraphQL Mutation!

Slide 53

Slide 53 text

mutation { changePicture(picture: p){ me { picture { url } } } }

Slide 54

Slide 54 text

ecosystem

Slide 55

Slide 55 text

ݎ઀ሿᇫ 1. graphql https://github.com/facebook/graphql 2. graphql-ruby https://github.com/rmosolgo/graphql-ruby 3. graphql-js https://github.com/graphql/graphql-js 4. graphql awesome list https://github.com/chentsulin/ awesome-graphql

Slide 56

Slide 56 text

௛ᕮ 1.ࣁੜᔉଶහഝഴګᵱ࿢ӥྲRESTๅঅ 2.ඪ೮᧛ٟ҅ฎਠෆጱහഝൈᬿ᧍᥺ 3.᭗አᥢ᝜҅ݢአձ֜᧍᥺ࣁձ֜ଘݣਫሿਮಁᒒ҈๐ۓᒒ 4.՗አಁ֛ḵ޾ਮಁᒒᦡᦇڊݎ 5.Өሿํapplicationᕮݳݝᵱࣁ๐ۓᒒୌᒈᔄࣳਧԎ 6.ݢӨREST APIوਂ

Slide 57

Slide 57 text

Q&A