Implementing and Using GraphQL
Kyle Daigle
Platform Interface Engineering Manager, GitHub
Dan Schafer
Software Engineer, Co-Creater of GraphQL, Facebook
Today
• Over 250,000 OAuth Applications
• Over 6,000,000 users have installed an OAuth app
• REST API v3
• Webhooks
Slide 4
Slide 4 text
But not without some pain...
Slide 5
Slide 5 text
Pains of our API
• Getting the data you want can be multiple REST calls
away
• It’s difficult for us to release comprehensive REST
responses that don’t expose too much data that’s too
expensive to calculate.
• When we’re forced to make a change, it’s very hard to
know who it will impact
• GitHub uses the API for its own integrations but not
for product features
Slide 6
Slide 6 text
Announcing
GitHub GraphQL API
Slide 7
Slide 7 text
We did some investigation...
Slide 8
Slide 8 text
Built a proof of concept...
Slide 9
Slide 9 text
Woah.
Slide 10
Slide 10 text
githubengineering.com
Slide 11
Slide 11 text
We headed to the source...
Slide 12
Slide 12 text
Introduction to GraphQL
Dan Schafer
Software Engineer, Facebook
Slide 13
Slide 13 text
Why GraphQL?
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
Join-tables
http://url.api/reso
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
GraphQL
Slide 18
Slide 18 text
{
me {
name
}
}
Slide 19
Slide 19 text
{
"me": {
"name": "Daniel Schafer"
}
}
{
me {
name
}
}
{
me {
name
friends {
name
events {
name
}
}
}
}
{
"me": {
"name": "Daniel Schafer",
"friends": [
{
"name": "Kyle Daigle",
"events": [
{
"name": "Github Universe"
},
{
"name": "GraphQL Meetup"
},
]
}
Slide 24
Slide 24 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
{
"me": {
"name": "Daniel Schafer",
"friends": [
{
"name": "Kyle Daigle",
"events": [
{
"name": "Github Universe"
}
]
}
]
}
}
Slide 25
Slide 25 text
Benefits of GraphQL
Slide 26
Slide 26 text
Mental Model for
Product Developers
Slide 27
Slide 27 text
Type System
Slide 28
Slide 28 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
Slide 29
Slide 29 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
Slide 30
Slide 30 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
type Query {
me: User
user(id: Int): User
}
Slide 31
Slide 31 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
type User {
name: String
profilePic(size: Int = 50): Image
friends(first: Int): [User]
events(first: Int): [Event]
}
Slide 32
Slide 32 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
type User {
name: String
profilePic(size: Int = 50): Image
friends(first: Int): [User]
events(first: Int): [Event]
}
Slide 33
Slide 33 text
{
me {
name
friends(first: 1) {
name
events(first: 1) {
name
}
}
}
}
type Event {
name: String
attendees(first: Int): [User]
}
Slide 34
Slide 34 text
{
me {
name
attendees(first: 1) {
name
}
}
}
Slide 35
Slide 35 text
{
me {
name
attendees(first: 1) {
name
}
}
}
Slide 36
Slide 36 text
{
me {
name
attendees(first: 1) {
name
}
}
}
type User {
name: String
profilePic(size: Int = 50): Image
friends(first: Int): [User]
events(first: Int): [Event]
}
Slide 37
Slide 37 text
Introspection
Slide 38
Slide 38 text
{
__schema {
types {
name
fields {
name
type { name }
}
}
}
}
type Query {
me: User
user(id: Int): User
}
type User {
name: String
profilePic(size: Int = 50): Image
friends(first: Int): [User]
events(first: Int): [Event]
}
type Event {
name: String
attendees(first: Int): [User]
}
Slide 39
Slide 39 text
Power to the Clients
Slide 40
Slide 40 text
Models
Views
Here's your 123 model
CLIENT
Model: 123, plz
APP SERVER
Slide 41
Slide 41 text
Models
Views v2
Here's your 123 model
CLIENT
Model: 123, plz
APP SERVER
Slide 42
Slide 42 text
Models
Models v2
Here's your 123 v2 model
CLIENT
Model: 123, v2, plz
APP SERVER
Views v2
Slide 43
Slide 43 text
CLIENT
APP SERVER
Views v3
Models
Models v2
Models v3
Here's your 123 v3 model
Model: 123, v3, plz
Slide 44
Slide 44 text
CLIENT
APP SERVER
Models v2
Models v3
Models v4
Views v4
Here's your 123 v4 model
Model: 123, v4, plz
Slide 45
Slide 45 text
Models
Views
Here's your 123 model
CLIENT
Model: 123, plz
APP SERVER
Model: 123, plz
Model: 123, plz
Model: 123, plz
Model: 123, plz
Model: 123, plz
Slide 46
Slide 46 text
Capabilities
Requirements
CLIENT
APP SERVER
Slide 47
Slide 47 text
Type System
Views
Models
This data shape, plz
Here's your specific data
CLIENT
APP SERVER
Slide 48
Slide 48 text
Views v2
Views
Models
Models v2
This data shape, plz
Here's your specific data
CLIENT
APP SERVER
Type System
Slide 49
Slide 49 text
Views v3
Views v2
Views
Models
Models v2
Models v3
This data shape, plz
Here's your specific data
CLIENT
APP SERVER
Type System
We are changing how we work
to help improve the platform.
Slide 56
Slide 56 text
We felt this building the
Projects REST API.
Slide 57
Slide 57 text
No content
Slide 58
Slide 58 text
Be transparent.
Slide 59
Slide 59 text
Public GitHub
Platform Roadmap
developer.github.com
Slide 60
Slide 60 text
Collaborate directly
with integrators.
Slide 61
Slide 61 text
platform.github.community
Slide 62
Slide 62 text
No content
Slide 63
Slide 63 text
GitHub Platform Forum
• Public forum to discuss early access and pre-release
features
• Staffed by GitHub Platform Engineers, Product
Managers, and Support staff
• Feedback can immediately be used by GitHub
engineers
• Integrators can work with each other to share novel
uses and best practices
Slide 64
Slide 64 text
Change how we build features
at GitHub.
Slide 65
Slide 65 text
Early Access Program
Slide 66
Slide 66 text
Early Access Program
• We will provide a communication channel to
collaboratively impact the direction and approach of a
project.
• We will strive to keep documentation updated, but you
can expect unannounced breaking changes as we develop
quickly.
• We may stop or pause access to Early Access releases at
any point.
• You will encounter bugs and there will be reliability and
stability hiccups.
Slide 67
Slide 67 text
Systemic support from Product
Managers, Support, and
Engineers makes this possible.
Slide 68
Slide 68 text
GitHub Engineers building on
top of the same platform.
Slide 69
Slide 69 text
Access to more data sooner.
Slide 70
Slide 70 text
We’re solving new problems
with GraphQL in the public.
Slide 71
Slide 71 text
Using OAuth tokens to limit
field & object visibility.
Slide 72
Slide 72 text
query {
viewer
}
user
Slide 73
Slide 73 text
query {
viewer {
repositories(first: 3) {
edges {
node {
name
}
}
}
}
}
user
repo
Slide 74
Slide 74 text
Will change to support
Integrations’ new permission
system.
Slide 75
Slide 75 text
Keeping some schema bits
internal while letting the rest be
public.
Slide 76
Slide 76 text
User = GraphQL::Object.define do
name “User”
available_for_targets [:public]
end
Slide 77
Slide 77 text
User = GraphQL::Object.define do
name “User”
available_if_flagged [:super_secret_ship]
end
Slide 78
Slide 78 text
There are also a lot of cool
parts of GraphQL in public.