Slide 1

Slide 1 text

Ville Immonen Ville Immonen Co-founder, Reindex Co-founder, Reindex @VilleImmonen @VilleImmonen GraphQL: GraphQL: A Developer-friendly A Developer-friendly Interface to Data Interface to Data

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Data fetching Data fetching

Slide 6

Slide 6 text

RESTful RESTful

Slide 7

Slide 7 text

GET /events/225873253 { "id": "225873253", "name": "HelsinkiJS October 2015", "description": "GraphQL: A Developer-friendly...", ... "links": { "self": "/events/225873253", "group": "/groups/14703552", "rsvps": "/events/225873253/rsvp", "comments": "/events/225873253/comments" } }

Slide 8

Slide 8 text

GET /events/225873253 GET /groups/14703552 GET /events/225873253/rsvps GET /events/225873253/comments

Slide 9

Slide 9 text

GET /events/225873253/comments [ { "comment": "Looking forward to the event!", "time": 1441903703000, "likeCount": 3, "links": { "self": "/events/225873253/454556582", "event": "/events/225873253", "member": "/members/13134851" } }, { "comment": "I'd love to participate, but can't make it this time", "time": 1441903713730, "likeCount": 0, "links": { "self": "/events/225873253/comments/454474924", "event": "/events/225873253", "member": "/members/13134851" } }, ... ]

Slide 10

Slide 10 text

GET /events/225873253 GET /groups/14703552 GET /events/225873253/rsvps GET /events/225873253/comments GET /members/13134851 GET /members/11692193 GET /members/67277782 GET /members/...

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Ad-hoc Ad-hoc (RPC) (RPC)

Slide 13

Slide 13 text

GET /getEvent ?id=225873253 &dataset=eventView { "id": "225873253", "name": "HelsinkiJS October 2015", "description": "GraphQL: A Developer-friendly...", "group": { ... }, "rsvps": [ ... ], "comments": [ { "comment": "I'd love to participate, but can't make it this time" "time": 1441903713730, "likeCount": 0 "member": { ... } }, ... ] }

Slide 14

Slide 14 text

GET /getEvent ?id=225873253 &dataset=eventViewV2 { "id": "225873253", "name": "HelsinkiJS October 2015", "description": "GraphQL: A Developer-friendly...", "group": { ... }, "rsvps": [ ... ], // "comments": [ // { // "comment": "I'd love to participate, but can't make it this time", // "time": 1441903713730, // "likeCount": 0 // "member": { ... } // }, // ... // ] }

Slide 15

Slide 15 text

GET /getEvent ?id=225873253 &include=group,rsvps,comments,comments.member { "id": "225873253", "name": "HelsinkiJS October 2015", "description": "GraphQL: A Developer-friendly...", "group": { ... }, "rsvps": [ ... ], "comments": [ { "comment": "I'd love to participate, but can't make it this time" "time": 1441903713730, "likeCount": 0 "member": { ... } }, ... ] }

Slide 16

Slide 16 text

RESTful RESTful Cache consistency ! Loose coupling ! Multiple round trips, slow " Ad-hoc Ad-hoc One request per view, fast ! Tight coupling " No cache consistency "

Slide 17

Slide 17 text

GraphQL GraphQL

Slide 18

Slide 18 text

{ event(id: 225873253) { id name description } } { "event" { "id": 225873253, "name": "HelsinkiJS October 2015" "description": "GraphQL: A Developer-friendly..." } }

Slide 19

Slide 19 text

{ event(id: 225873253) { id name description group { name } rsvps { name introduction } } } { "event" { "id": 225873253, "name": "HelsinkiJS October 2015" "description": "GraphQL: A Developer-friendly..." "group": { "name": }, "rsvps": [{ "name": "Ville Immonen", "introduction": "Building stuff with GraphQL" }], } }

Slide 20

Slide 20 text

{ event(id: 225873253) { id name description group { name } rsvps { name introduction } comments { comment time likeCount member { name profilePicture { url } } } } } { "event" { "id": 225873253, "name": "HelsinkiJS October 2015" "description": "GraphQL: A Developer-friendly..." "group": { "name": }, "rsvps": [{ "name": "Ville Immonen", "introduction": "Building stuff with GraphQL" }], "comments" [{ "comment": "I'd love to participate, but can't m "time": 1441903713730, "likeCount": 0 "member": { "name": "John Doe", "profilePicture": { "url": "/i/john.jpg" } } }] } }

Slide 21

Slide 21 text

{ member(id: 13134851) { profilePicture(size: 100) { width height url } } } { "member" { "profilePicture": { "width": 100, "height": 75, "url": "/i/john_100x75.jpg" } } }

Slide 22

Slide 22 text

{ member(id: 13134851) { profilePicture(size: 50) { width height url } } } { "member" { "profilePicture": { "width": 50, "height": 50, "url": "/i/john_50x50.jpg" } } }

Slide 23

Slide 23 text

Schema Schema

Slide 24

Slide 24 text

type Event implements Node { comments: [Comment] description: String group: Group id: ID! name: String } type Comment { comment: String likeCount: Int member: Member time: DateTime } type Member { name: String profilePicture: Picture } type Picture { width: Int height: Int url: String }

Slide 25

Slide 25 text

Tools Tools

Slide 26

Slide 26 text

Demo! Demo!

Slide 27

Slide 27 text

Applications Applications

Slide 28

Slide 28 text

Using GraphQL Using GraphQL

Slide 29

Slide 29 text

Facebook Facebook

Slide 30

Slide 30 text

Financial Times Financial Times

Slide 31

Slide 31 text

HSL Journey HSL Journey Planner Planner

Slide 32

Slide 32 text

Client-side Client-side

Slide 33

Slide 33 text

Mobile Mobile

Slide 34

Slide 34 text

Relay Relay + + React React

Slide 35

Slide 35 text

Relay Relay ♥ React React Native Native

Slide 36

Slide 36 text

Server Server graphql-js libgraphqlparser graphql-ruby graphql-java Reindex

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Instant GraphQL Instant GraphQL server server

Slide 39

Slide 39 text

Build apps Build apps without servers without servers

Slide 40

Slide 40 text

[ { "name": "Group", "kind": "OBJECT", "interfaces": [ "Node" ], "fields": [ { "name": "id", "type": "ID", "nonNull": true }, { "name": "name", "type": "String" }, { "name": "events", "type": "Connection", "ofType": "Event", "reverseName": "group" } ] }, ...

Slide 41

Slide 41 text

> reindex schema-push Reading schema from ./ReindexSchema.json... Requesting migration from API... Migrations: [DONE] create new type Comment [DONE] create new type Event [DONE] create new type Group [DONE] create new type Member [DONE] create new type Picture [DONE] create new type RSVP Successfully migrated!

Slide 42

Slide 42 text

@reindexio www.reindex.io