{"action":"created","comment":{"url":"https://api.github.com/repos/apollographql/apollo/pulls/comments/225245995","pull_request_review_id":164806341,"id":225245995,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNTI0NTk5NQ==","diff_hunk":"@@ -3,10 +3,370 @@ title: \"3. Write your graph's resolvers\"\n description: Start here for the Apollo fullstack tutorial\n ---\n \n+It's time to finally leverage all the data sources logic in our graph's resolvers. Resolvers provide the instructions for turning a graph operation into data. They are functions that fetch or modify data from underlying data sources for fields in a schema type. There are a few things to note about resolver functions.\n+\n+1. A resolver function must bear the same name as the field it operates on.\n+2. A resolver function must return the type of data that was specified in the schema field.\n+\n <h2 id=\"data-sources\">Call your data sources in resolvers</h2>\n \n+In the previous section of this tutorial, two data source classes were created and passed as options to the `ApolloServer` constructor. We'll access those data sources in our resolvers soon! First, let's know more about a resolver function signature.\n+\n+Resolver functions accepts four arguments:\n+\n+```js\n+fieldName(parent, args, context, info) {\n+ // implementation\n+}\n+```\n+\n+* **parent**: This is an object that contains the result returned from the resolver on the parent field.\n+* **args**: This is an object that contains the field arguments specified in a query.\n+* **context**: This is an object shared by all resolvers in a particular query, and is used to contain per-request state, including authentication information, dataloader instances, and anything else that should be taken into account when resolving the query.\n+* **info**: This argument has information about the execution state of the query. Mostly used in advanced cases.\n+\n+Go ahead and create a `resolvers.js` file in the `src` directory. Let's start with the `Query` resolver functions.\n+\n+Copy the code below and paste it in the file.\n+\n+_src/resolvers.js_\n+\n+```js\n+module.exports = {\n+  Query: {\n+    launches: async (_, __, { dataSources }) =>\n+      dataSources.launchAPI.getAllLaunches(),\n+    launch: (_, { id }, { dataSources }) =>\n+      dataSources.launchAPI.getLaunchById({ launchId: id }),\n+    me: async (_, __, { dataSources }) =>\n+      dataSources.userAPI.findOrCreateUser(),\n+  },\n+};\n+```\n+\n+The code above shows the resolver functions for the `Query` type fields: `launches`, `launch`, and `me`.\n+\n+Note that the `{ dataSources }` appear as the third argument in any resolver function because Apollo Server puts the `dataSources` object on the context for every request.\n+\n+The `launches` resolver invokes the `getAllLaunches` function from the launch data source class and returns its data.\n+\n+The `launch` resolver takes in an `id` as the second argument which represents a `launchId`. Then, a request is made to fetch a launch by calling the `getLaunchById` method of the launch data source class.\n+\n+The `me` resolver simply checks if a user exists or not via the `findOrCreateUser()` from the user data source class. If the user doesn't exist, then a new user is created, stored and returned.\n+\n+The resolver functions look simple and concise because the logic is embedded in the launch and user data sources. Both classes abstracted the code away.\n+\n+Now, let's move on to the `Mutation` resolver functions.\n+\n+Copy the code below and paste it just after the `Query` resolver functions in the file.\n+\n+_src/resolvers.js_\n+\n+```js\n+...\n+Mutation: {\n+  bookTrip: async (_, { launchId }, { dataSources }) => {\n+    const result = await dataSources.userAPI.bookTrip({ launchId });\n+    if (!result)\n+      return {\n+        success: false,\n+        message: 'failed to book trip',\n+      };\n+\n+    const launch = await dataSources.launchAPI.getLaunchById({ launchId });\n+    return {\n+      success: true,\n+      message: 'trip booked',\n+      launch,\n+    };\n+  },\n+  cancelTrip: async (_, { launchId }, { dataSources }) => {\n+    const result = dataSources.userAPI.cancelTrip({ launchId });\n+\n+    if (!result)\n+      return {\n+        success: false,\n+        message: 'failed to cancel trip',\n+      };\n+\n+    const launch = await dataSources.launchAPI.getLaunchById({ launchId });\n+    return {\n+      success: true,\n+      message: 'trip cancelled',\n+      launch,\n+    };\n+  },\n+  login: async (_, { email }, { dataSources }) => {\n+    const user = await dataSources.userAPI.findOrCreateUser({ email });\n+    if (user) return new Buffer(email).toString('base64');\n+    return false;\n+  },\n+},\n+```\n+\n+As shown in the code above, there are three resolver functions, `bookTrip`, `cancelTrip`, and `login`.\n+\n+The `bookTrip` function takes in a `launchId`, and makes a request to book a trip for that particular launch. If a trip is booked successfully, then the function retrieves the booked launch and returns an object containing a success status and message back to the client.\n+\n+The `cancelTrip` function takes in a `launchId`, and makes a request via the `cancelTrip` method of the user data source to cancel a trip. If a trip is canceled successfully, then the function retrieves the launch that has been canceled and returns an object indicating a success status back to the client.\n+\n+For both functions, if the request fails, then an object containing a failed success status and message is returned to the client.\n+\n+The `login` function takes in an email, checks the user table in the database via the `findOrCreateUser` method to verify if the user exists or not. If the user exists or a new user is created, return a `base64` encoding of the user's email.\n+\n+The `base64` encoding of the user's detail is for obscuring the data. The result is a form of unique string token which we use for authentication.\n+\n+Now, we need to add a resolver function to take care of the booked status on a launch. Copy the code below and paste it just after the `Mutation` resolver functions.\n+\n+_src/resolvers.js_\n+\n+```js\n+...\n+Launch: {\n+  isBooked: async (launch, _, { dataSources }) =>\n+    dataSources.userAPI.isBookedOnLaunch({ launchId: launch.id }),\n+}\n+```\n+\n+The `isBooked` function makes a request to the `isBookedOnLaunch` method of the `UserAPI` datasource class with the id of a launch. This request confirms whether the launch has been booked by the logged-in user.\n+\n+Now, let's implement the `User` resolver functions.\n+\n+Copy the code below and paste it just after the `Launch` resolver function.\n+\n+_src/resolvers.js_\n+\n+```js\n+...\n+User: {\n+  trips: async (_, __, { dataSources }) => {\n+    // get ids of launches by user\n+    const launchIds = await dataSources.userAPI.getLaunchIdsByUser();\n+\n+    if (!launchIds.length) return [];\n+\n+    // look up those launches by their ids\n+    return (\n+      dataSources.launchAPI.getLaunchesByIds({\n+        launchIds,\n+      }) || []\n+    );\n+  },\n+},\n+```\n+\n+When trips for a particular user are requested for, what data is returned?\n+\n+The `trips` resolver function works like the steps outlined below:\n+\n+1. It fetches the ids of all the launches a user has ever booked a trip for via the user data source's `getLaunchIdsByUser()` method. Check the code for the `getLaunchIdsByUser` method in the `UserAPI` class to refresh your memory on how the fetch happens.\n+2. If there are no launch ids, an empty array is returned. This means the user has not embarked on any trip.\n+3. If there's an array of launch ids, fetch all the launches via their ids.\n+\n <h2 id=\"write-query\">Write a query in the playground</h2>\n \n+Apollo Server sets up GraphQL Playground so that you can start running queries and exploring schemas quickly. Go ahead and open the graph service URL in a browser, `http://localhost:4000/`.\n+\n+Start by copying the query below and pasting it in the left side of the playground. After pasting, hit the Play button at the center to get a response.\n+\n+```js","path":"docs/source/tutorial/resolvers.md","position":180,"original_position":170,"commit_id":"e3bfe1105e5dda0a09aeddd8f72e7b6a280308e6","original_commit_id":"ad302e7cc6a534c5d73f65eca5c1925fd10438d9","user":{"login":"unicodeveloper","id":2946769,"node_id":"MDQ6VXNlcjI5NDY3Njk=","avatar_url":"https://avatars1.githubusercontent.com/u/2946769?v=4","gravatar_id":"","url":"https://api.github.com/users/unicodeveloper","html_url":"https://github.com/unicodeveloper","followers_url":"https://api.github.com/users/unicodeveloper/followers","following_url":"https://api.github.com/users/unicodeveloper/following{/other_user}","gists_url":"https://api.github.com/users/unicodeveloper/gists{/gist_id}","starred_url":"https://api.github.com/users/unicodeveloper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unicodeveloper/subscriptions","organizations_url":"https://api.github.com/users/unicodeveloper/orgs","repos_url":"https://api.github.com/users/unicodeveloper/repos","events_url":"https://api.github.com/users/unicodeveloper/events{/privacy}","received_events_url":"https://api.github.com/users/unicodeveloper/received_events","type":"User","site_admin":false},"body":"Showed a query with an argument. I can't show a mutation at this point, because the two mutations, `bookTrip`, and `cancelTrip` depends on a logged-in user id and the `login` mutation method is added at the end of this section","created_at":"2018-10-15T17:09:20Z","updated_at":"2018-10-15T17:09:20Z","html_url":"https://github.com/apollographql/apollo/pull/213#discussion_r225245995","pull_request_url":"https://api.github.com/repos/apollographql/apollo/pulls/213","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/comments/225245995"},"html":{"href":"https://github.com/apollographql/apollo/pull/213#discussion_r225245995"},"pull_request":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/213"}},"in_reply_to_id":225029474},"pull_request":{"url":"https://api.github.com/repos/apollographql/apollo/pulls/213","id":221200583,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIxMjAwNTgz","html_url":"https://github.com/apollographql/apollo/pull/213","diff_url":"https://github.com/apollographql/apollo/pull/213.diff","patch_url":"https://github.com/apollographql/apollo/pull/213.patch","issue_url":"https://api.github.com/repos/apollographql/apollo/issues/213","number":213,"state":"open","locked":false,"title":"Write your graph's resolvers section","user":{"login":"unicodeveloper","id":2946769,"node_id":"MDQ6VXNlcjI5NDY3Njk=","avatar_url":"https://avatars1.githubusercontent.com/u/2946769?v=4","gravatar_id":"","url":"https://api.github.com/users/unicodeveloper","html_url":"https://github.com/unicodeveloper","followers_url":"https://api.github.com/users/unicodeveloper/followers","following_url":"https://api.github.com/users/unicodeveloper/following{/other_user}","gists_url":"https://api.github.com/users/unicodeveloper/gists{/gist_id}","starred_url":"https://api.github.com/users/unicodeveloper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unicodeveloper/subscriptions","organizations_url":"https://api.github.com/users/unicodeveloper/orgs","repos_url":"https://api.github.com/users/unicodeveloper/repos","events_url":"https://api.github.com/users/unicodeveloper/events{/privacy}","received_events_url":"https://api.github.com/users/unicodeveloper/received_events","type":"User","site_admin":false},"body":"<!--**Pull Request Labels**\r\n\r\nWhile not necessary, you can help organize our pull requests by labeling this issue when you open it.  To add a label automatically, simply [x] mark the appropriate box below:\r\n\r\n- [ ] feature\r\n- [ ] blocking\r\n- [ ] docs\r\n\r\nTo add a label not listed above, simply place `/label another-label-name` on a line by itself.\r\n-->","created_at":"2018-10-08T18:08:55Z","updated_at":"2018-10-15T17:09:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8496c14767f016175a1910def1b83100bb798524","assignee":null,"assignees":[],"requested_reviewers":[{"login":"abernix","id":841294,"node_id":"MDQ6VXNlcjg0MTI5NA==","avatar_url":"https://avatars0.githubusercontent.com/u/841294?v=4","gravatar_id":"","url":"https://api.github.com/users/abernix","html_url":"https://github.com/abernix","followers_url":"https://api.github.com/users/abernix/followers","following_url":"https://api.github.com/users/abernix/following{/other_user}","gists_url":"https://api.github.com/users/abernix/gists{/gist_id}","starred_url":"https://api.github.com/users/abernix/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abernix/subscriptions","organizations_url":"https://api.github.com/users/abernix/orgs","repos_url":"https://api.github.com/users/abernix/repos","events_url":"https://api.github.com/users/abernix/events{/privacy}","received_events_url":"https://api.github.com/users/abernix/received_events","type":"User","site_admin":false},{"login":"JakeDawkins","id":9259509,"node_id":"MDQ6VXNlcjkyNTk1MDk=","avatar_url":"https://avatars1.githubusercontent.com/u/9259509?v=4","gravatar_id":"","url":"https://api.github.com/users/JakeDawkins","html_url":"https://github.com/JakeDawkins","followers_url":"https://api.github.com/users/JakeDawkins/followers","following_url":"https://api.github.com/users/JakeDawkins/following{/other_user}","gists_url":"https://api.github.com/users/JakeDawkins/gists{/gist_id}","starred_url":"https://api.github.com/users/JakeDawkins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JakeDawkins/subscriptions","organizations_url":"https://api.github.com/users/JakeDawkins/orgs","repos_url":"https://api.github.com/users/JakeDawkins/repos","events_url":"https://api.github.com/users/JakeDawkins/events{/privacy}","received_events_url":"https://api.github.com/users/JakeDawkins/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apollographql/apollo/pulls/213/commits","review_comments_url":"https://api.github.com/repos/apollographql/apollo/pulls/213/comments","review_comment_url":"https://api.github.com/repos/apollographql/apollo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apollographql/apollo/issues/213/comments","statuses_url":"https://api.github.com/repos/apollographql/apollo/statuses/e3bfe1105e5dda0a09aeddd8f72e7b6a280308e6","head":{"label":"apollographql:writegraphresolvers","ref":"writegraphresolvers","sha":"e3bfe1105e5dda0a09aeddd8f72e7b6a280308e6","user":{"login":"apollographql","id":17189275,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MTg5Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"repo":{"id":50384229,"node_id":"MDEwOlJlcG9zaXRvcnk1MDM4NDIyOQ==","name":"apollo","full_name":"apollographql/apollo","private":false,"owner":{"login":"apollographql","id":17189275,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MTg5Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/apollographql/apollo","description":":rocket: Open source tools for GraphQL. Central repo for discussion.","fork":false,"url":"https://api.github.com/repos/apollographql/apollo","forks_url":"https://api.github.com/repos/apollographql/apollo/forks","keys_url":"https://api.github.com/repos/apollographql/apollo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apollographql/apollo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apollographql/apollo/teams","hooks_url":"https://api.github.com/repos/apollographql/apollo/hooks","issue_events_url":"https://api.github.com/repos/apollographql/apollo/issues/events{/number}","events_url":"https://api.github.com/repos/apollographql/apollo/events","assignees_url":"https://api.github.com/repos/apollographql/apollo/assignees{/user}","branches_url":"https://api.github.com/repos/apollographql/apollo/branches{/branch}","tags_url":"https://api.github.com/repos/apollographql/apollo/tags","blobs_url":"https://api.github.com/repos/apollographql/apollo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apollographql/apollo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apollographql/apollo/git/refs{/sha}","trees_url":"https://api.github.com/repos/apollographql/apollo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apollographql/apollo/statuses/{sha}","languages_url":"https://api.github.com/repos/apollographql/apollo/languages","stargazers_url":"https://api.github.com/repos/apollographql/apollo/stargazers","contributors_url":"https://api.github.com/repos/apollographql/apollo/contributors","subscribers_url":"https://api.github.com/repos/apollographql/apollo/subscribers","subscription_url":"https://api.github.com/repos/apollographql/apollo/subscription","commits_url":"https://api.github.com/repos/apollographql/apollo/commits{/sha}","git_commits_url":"https://api.github.com/repos/apollographql/apollo/git/commits{/sha}","comments_url":"https://api.github.com/repos/apollographql/apollo/comments{/number}","issue_comment_url":"https://api.github.com/repos/apollographql/apollo/issues/comments{/number}","contents_url":"https://api.github.com/repos/apollographql/apollo/contents/{+path}","compare_url":"https://api.github.com/repos/apollographql/apollo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apollographql/apollo/merges","archive_url":"https://api.github.com/repos/apollographql/apollo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apollographql/apollo/downloads","issues_url":"https://api.github.com/repos/apollographql/apollo/issues{/number}","pulls_url":"https://api.github.com/repos/apollographql/apollo/pulls{/number}","milestones_url":"https://api.github.com/repos/apollographql/apollo/milestones{/number}","notifications_url":"https://api.github.com/repos/apollographql/apollo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apollographql/apollo/labels{/name}","releases_url":"https://api.github.com/repos/apollographql/apollo/releases{/id}","deployments_url":"https://api.github.com/repos/apollographql/apollo/deployments","created_at":"2016-01-25T22:03:43Z","updated_at":"2018-10-15T06:02:37Z","pushed_at":"2018-10-15T16:44:05Z","git_url":"git://github.com/apollographql/apollo.git","ssh_url":"git@github.com:apollographql/apollo.git","clone_url":"https://github.com/apollographql/apollo.git","svn_url":"https://github.com/apollographql/apollo","homepage":"https://www.apollographql.com","size":7995,"stargazers_count":1900,"watchers_count":1900,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":91,"mirror_url":null,"archived":false,"open_issues_count":15,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":91,"open_issues":15,"watchers":1900,"default_branch":"master"}},"base":{"label":"apollographql:fullstack-tutorial","ref":"fullstack-tutorial","sha":"58f9ff71a3fe09d9142988b49b700f58aa5eac29","user":{"login":"apollographql","id":17189275,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MTg5Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"repo":{"id":50384229,"node_id":"MDEwOlJlcG9zaXRvcnk1MDM4NDIyOQ==","name":"apollo","full_name":"apollographql/apollo","private":false,"owner":{"login":"apollographql","id":17189275,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MTg5Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/apollographql/apollo","description":":rocket: Open source tools for GraphQL. Central repo for discussion.","fork":false,"url":"https://api.github.com/repos/apollographql/apollo","forks_url":"https://api.github.com/repos/apollographql/apollo/forks","keys_url":"https://api.github.com/repos/apollographql/apollo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apollographql/apollo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apollographql/apollo/teams","hooks_url":"https://api.github.com/repos/apollographql/apollo/hooks","issue_events_url":"https://api.github.com/repos/apollographql/apollo/issues/events{/number}","events_url":"https://api.github.com/repos/apollographql/apollo/events","assignees_url":"https://api.github.com/repos/apollographql/apollo/assignees{/user}","branches_url":"https://api.github.com/repos/apollographql/apollo/branches{/branch}","tags_url":"https://api.github.com/repos/apollographql/apollo/tags","blobs_url":"https://api.github.com/repos/apollographql/apollo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apollographql/apollo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apollographql/apollo/git/refs{/sha}","trees_url":"https://api.github.com/repos/apollographql/apollo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apollographql/apollo/statuses/{sha}","languages_url":"https://api.github.com/repos/apollographql/apollo/languages","stargazers_url":"https://api.github.com/repos/apollographql/apollo/stargazers","contributors_url":"https://api.github.com/repos/apollographql/apollo/contributors","subscribers_url":"https://api.github.com/repos/apollographql/apollo/subscribers","subscription_url":"https://api.github.com/repos/apollographql/apollo/subscription","commits_url":"https://api.github.com/repos/apollographql/apollo/commits{/sha}","git_commits_url":"https://api.github.com/repos/apollographql/apollo/git/commits{/sha}","comments_url":"https://api.github.com/repos/apollographql/apollo/comments{/number}","issue_comment_url":"https://api.github.com/repos/apollographql/apollo/issues/comments{/number}","contents_url":"https://api.github.com/repos/apollographql/apollo/contents/{+path}","compare_url":"https://api.github.com/repos/apollographql/apollo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apollographql/apollo/merges","archive_url":"https://api.github.com/repos/apollographql/apollo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apollographql/apollo/downloads","issues_url":"https://api.github.com/repos/apollographql/apollo/issues{/number}","pulls_url":"https://api.github.com/repos/apollographql/apollo/pulls{/number}","milestones_url":"https://api.github.com/repos/apollographql/apollo/milestones{/number}","notifications_url":"https://api.github.com/repos/apollographql/apollo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apollographql/apollo/labels{/name}","releases_url":"https://api.github.com/repos/apollographql/apollo/releases{/id}","deployments_url":"https://api.github.com/repos/apollographql/apollo/deployments","created_at":"2016-01-25T22:03:43Z","updated_at":"2018-10-15T06:02:37Z","pushed_at":"2018-10-15T16:44:05Z","git_url":"git://github.com/apollographql/apollo.git","ssh_url":"git@github.com:apollographql/apollo.git","clone_url":"https://github.com/apollographql/apollo.git","svn_url":"https://github.com/apollographql/apollo","homepage":"https://www.apollographql.com","size":7995,"stargazers_count":1900,"watchers_count":1900,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":91,"mirror_url":null,"archived":false,"open_issues_count":15,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":91,"open_issues":15,"watchers":1900,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/213"},"html":{"href":"https://github.com/apollographql/apollo/pull/213"},"issue":{"href":"https://api.github.com/repos/apollographql/apollo/issues/213"},"comments":{"href":"https://api.github.com/repos/apollographql/apollo/issues/213/comments"},"review_comments":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/213/comments"},"review_comment":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apollographql/apollo/pulls/213/commits"},"statuses":{"href":"https://api.github.com/repos/apollographql/apollo/statuses/e3bfe1105e5dda0a09aeddd8f72e7b6a280308e6"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"unicodeveloper"}}