Slide 1

Slide 1 text

How people build software ! GraphQL on Rails How GitHub uses GraphQL internally

Slide 2

Slide 2 text

How people build software " Jakob Class Application Engineer
 
 " github.com/mikrobi 2 $

Slide 3

Slide 3 text

How people build software " " What is GraphQL? 3 A language to specify and query APIs.

Slide 4

Slide 4 text

How people build software " " What is GraphQL? 4 Describe your data
 
 type User {
 login: String
 name: String
 repositories: [Repository] }
 Ask for what you want
 
 {
 user(login: "mikrobi") {
 name
 }
 }
 Get predicable results
 
 { "user": { "name": "Jakob Class" } }


Slide 5

Slide 5 text

How people build software " " What’s the problem with REST APIs? 5 GET /users/mikrobi/repos?per_page=5 Task 1: Get the name of mikrobi’s top 5 repositories

Slide 6

Slide 6 text

[ { "id": 17900437, "name": "appirater", "full_name": "mikrobi/appirater", "owner": { "login": "mikrobi", "id": 423347, "avatar_url": "https://avatars0.githubusercontent.com/u/423347?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mikrobi", "html_url": "https://github.com/mikrobi", "followers_url": "https://api.github.com/users/mikrobi/followers", "following_url": "https://api.github.com/users/mikrobi/following{/other_user}", "gists_url": "https://api.github.com/users/mikrobi/gists{/gist_id}", "starred_url": "https://api.github.com/users/mikrobi/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mikrobi/subscriptions", "organizations_url": "https://api.github.com/users/mikrobi/orgs", "repos_url": "https://api.github.com/users/mikrobi/repos", "events_url": "https://api.github.com/users/mikrobi/events{/privacy}", "received_events_url": "https://api.github.com/users/mikrobi/received_events", "type": "User", "site_admin": true }, "private": false, "html_url": "https://github.com/mikrobi/appirater",

Slide 7

Slide 7 text

"description": "A utility that reminds your iPhone app's users to review the app.", "fork": true, "url": "https://api.github.com/repos/mikrobi/appirater", "forks_url": "https://api.github.com/repos/mikrobi/appirater/forks", "keys_url": "https://api.github.com/repos/mikrobi/appirater/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/mikrobi/appirater/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/mikrobi/appirater/teams", "hooks_url": "https://api.github.com/repos/mikrobi/appirater/hooks", "issue_events_url": "https://api.github.com/repos/mikrobi/appirater/issues/events{/number}", "events_url": "https://api.github.com/repos/mikrobi/appirater/events", "assignees_url": "https://api.github.com/repos/mikrobi/appirater/assignees{/user}", "branches_url": "https://api.github.com/repos/mikrobi/appirater/branches{/branch}", "tags_url": "https://api.github.com/repos/mikrobi/appirater/tags", "blobs_url": "https://api.github.com/repos/mikrobi/appirater/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/mikrobi/appirater/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/mikrobi/appirater/git/refs{/sha}", "trees_url": "https://api.github.com/repos/mikrobi/appirater/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/mikrobi/appirater/statuses/{sha}", "languages_url": "https://api.github.com/repos/mikrobi/appirater/languages", "stargazers_url": "https://api.github.com/repos/mikrobi/appirater/stargazers", "contributors_url": "https://api.github.com/repos/mikrobi/appirater/contributors", "subscribers_url": "https://api.github.com/repos/mikrobi/appirater/subscribers", "subscription_url": "https://api.github.com/repos/mikrobi/appirater/subscription", "commits_url": "https://api.github.com/repos/mikrobi/appirater/commits{/sha}", "git_commits_url": "https://api.github.com/repos/mikrobi/appirater/git/commits{/sha}", "comments_url": "https://api.github.com/repos/mikrobi/appirater/comments{/number}",

Slide 8

Slide 8 text

"issue_comment_url": "https://api.github.com/repos/mikrobi/appirater/issues/comments{/number}", "contents_url": "https://api.github.com/repos/mikrobi/appirater/contents/{+path}", "compare_url": "https://api.github.com/repos/mikrobi/appirater/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/mikrobi/appirater/merges", "archive_url": "https://api.github.com/repos/mikrobi/appirater/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/mikrobi/appirater/downloads", "issues_url": "https://api.github.com/repos/mikrobi/appirater/issues{/number}", "pulls_url": "https://api.github.com/repos/mikrobi/appirater/pulls{/number}", "milestones_url": "https://api.github.com/repos/mikrobi/appirater/milestones{/number}", "notifications_url": "https://api.github.com/repos/mikrobi/appirater/notifications{?since,all,participating}" "labels_url": "https://api.github.com/repos/mikrobi/appirater/labels{/name}", "releases_url": "https://api.github.com/repos/mikrobi/appirater/releases{/id}", "deployments_url": "https://api.github.com/repos/mikrobi/appirater/deployments", "created_at": "2014-03-19T10:37:41Z", "updated_at": "2014-03-19T10:37:41Z", "pushed_at": "2014-03-14T23:53:01Z", "git_url": "git://github.com/mikrobi/appirater.git", "ssh_url": "[email protected]:mikrobi/appirater.git", "clone_url": "https://github.com/mikrobi/appirater.git", "svn_url": "https://github.com/mikrobi/appirater", "homepage": "http://arashpayan.com/blog/index.php/2009/09/07/presenting-appirater/", "size": 224, "stargazers_count": 0, "watchers_count": 0, "language": "Objective-C", "has_issues": false,

Slide 9

Slide 9 text

"has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "open_issues_count": 0, "forks": 0, "open_issues": 0, "watchers": 0, "default_branch": "master" }, { "id": 1146825, "name": "Archivist", "full_name": "mikrobi/Archivist", "owner": { "login": "mikrobi", "id": 423347, "avatar_url": "https://avatars0.githubusercontent.com/u/423347?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mikrobi", "html_url": "https://github.com/mikrobi", "followers_url": "https://api.github.com/users/mikrobi/followers", "following_url": "https://api.github.com/users/mikrobi/following{/other_user}", "gists_url": "https://api.github.com/users/mikrobi/gists{/gist_id}",

Slide 10

Slide 10 text

How people build software " " After parsing 27 kilobytes… 10 [ "name": "appirater", "name": "Archivist", "name": "babel", "name": "CCHMapCluster", "name": "cordova-docs" ]

Slide 11

Slide 11 text

How people build software " " How does GraphQL solve this problem? 11 user(login: "mikrobi") { repositories(first: 5) { nodes { name } } } "user": { "repositories": { "nodes": [ { "name": "appirater" }, { "name": "Archivist" }, { "name": "babel" }, { "name": "CCHMapClusterController" }, { "name": “cordova-docs" } ] } }

Slide 12

Slide 12 text

How people build software " " What’s the problem with REST APIs? 12 GET /orgs/:owner/repos?per_page=5 Task 2: Get the title of the first issue of the top 5 repositories # 1 request
 
 # 5 requests for :repo in [repos] GET /repos/:owner/:repo/issues/1

Slide 13

Slide 13 text

How people build software " " How does GraphQL solve this problem? 13 organization(login: "rails") { repositories(first: 5) { nodes { issue(number: 1) { title } } } } "organization": { "repositories": { "nodes": [ { "issue": { "title": "Rails is not Django" } }, { "issue": null }, { "issue": { "title": "before_validation_on_create" } }, { "issue": { "title": "add_child on new records" } }, { "issue": { "title": "Does not work with Rails 2.3.8" } } ] } }

Slide 14

Slide 14 text

How people build software " " Live demo and real code… 14 https://github.com/github/github-graphql-rails-example

Slide 15

Slide 15 text

How people build software " " Thank you! 15 attendees(first: 5) { nodes {
 name questions(first: 1) { nodes { summary
 }
 }
 } }