{"action":"created","comment":{"url":"https://api.github.com/repos/aergonaut/cody/pulls/comments/125991516","pull_request_review_id":48436127,"id":125991516,"diff_hunk":"@@ -0,0 +1,41 @@\n+// @flow\n+\n+import React from \"react\";\n+import { createFragmentContainer, graphql } from \"react-relay\";\n+import { Link } from \"react-router-dom\";\n+import type { PullRequest_pullRequest } from \"./__generated__/PullRequest_pullRequest.graphql\";\n+\n+const PullRequest = ({\n+  pullRequest: { id, number, repository, status }","path":"app/javascript/pulls/components/PullRequest.jsx","position":9,"original_position":9,"commit_id":"e6015bdf6d8f93bbb3295d481dcb97c9a4d28cb7","original_commit_id":"e6015bdf6d8f93bbb3295d481dcb97c9a4d28cb7","user":{"login":"houndci-bot","id":6697940,"avatar_url":"https://avatars3.githubusercontent.com/u/6697940?v=3","gravatar_id":"","url":"https://api.github.com/users/houndci-bot","html_url":"https://github.com/houndci-bot","followers_url":"https://api.github.com/users/houndci-bot/followers","following_url":"https://api.github.com/users/houndci-bot/following{/other_user}","gists_url":"https://api.github.com/users/houndci-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci-bot/subscriptions","organizations_url":"https://api.github.com/users/houndci-bot/orgs","repos_url":"https://api.github.com/users/houndci-bot/repos","events_url":"https://api.github.com/users/houndci-bot/events{/privacy}","received_events_url":"https://api.github.com/users/houndci-bot/received_events","type":"User","site_admin":false},"body":"'id' is defined but never used  no-unused-vars","created_at":"2017-07-06T19:16:55Z","updated_at":"2017-07-06T19:16:55Z","html_url":"https://github.com/aergonaut/cody/pull/67#discussion_r125991516","pull_request_url":"https://api.github.com/repos/aergonaut/cody/pulls/67","_links":{"self":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/comments/125991516"},"html":{"href":"https://github.com/aergonaut/cody/pull/67#discussion_r125991516"},"pull_request":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/67"}}},"pull_request":{"url":"https://api.github.com/repos/aergonaut/cody/pulls/67","id":129256834,"html_url":"https://github.com/aergonaut/cody/pull/67","diff_url":"https://github.com/aergonaut/cody/pull/67.diff","patch_url":"https://github.com/aergonaut/cody/pull/67.patch","issue_url":"https://api.github.com/repos/aergonaut/cody/issues/67","number":67,"state":"open","locked":false,"title":"React/Relay Frontend + GraphQL backend","user":{"login":"aergonaut","id":284007,"avatar_url":"https://avatars3.githubusercontent.com/u/284007?v=3","gravatar_id":"","url":"https://api.github.com/users/aergonaut","html_url":"https://github.com/aergonaut","followers_url":"https://api.github.com/users/aergonaut/followers","following_url":"https://api.github.com/users/aergonaut/following{/other_user}","gists_url":"https://api.github.com/users/aergonaut/gists{/gist_id}","starred_url":"https://api.github.com/users/aergonaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aergonaut/subscriptions","organizations_url":"https://api.github.com/users/aergonaut/orgs","repos_url":"https://api.github.com/users/aergonaut/repos","events_url":"https://api.github.com/users/aergonaut/events{/privacy}","received_events_url":"https://api.github.com/users/aergonaut/received_events","type":"User","site_admin":false},"body":"Expecting Hound to barf all over this PR until I figure out how to make it use my ESLint config correctly. Also no clue what CodeClimate is going to do, but I also expect it to be wild until I figure out how to tame it.\r\n\r\n## A proper frontend!\r\n\r\nWe're finally adding a proper frontend! Right now it's pretty much just a read-only view into the Pull Requests that Cody knows about. I plan to extend this in the future so that users can also use the UI to configure Review Rules. That is entirely done through the console right now so I want to make it more self-service.\r\n\r\nThe frontend is based on React and Relay, and uses Webpacker to manage Webpack and hook it into the Asset Pipeline compilation process.\r\n\r\nFor frontend routing, I'm using React Router v4. I also have the Rails routes configured so that all of the frontend routes are also reachable through Rails and point to the same controller action so the React app can start and take over. I could add server-side rendering in the future, if I can figure out a good way to do that with Webpacker.\r\n\r\nFor CSS, I'm using Bulma. Cody originally had Tachyons vendored, but I wanted something a little higher-level than Tachyons, so I chose Bulma as I like it's CSS class structure more than other frameworks out there, and I like it's look-and-feel.\r\n\r\n## A GraphQL backend!\r\n\r\nTo support Relay, Cody now has a GraphQL API!\r\n\r\nThe API is private right now since it's only meant to be used by the React frontend. I plan on extending it later so that it can be public and use API keys to authenticate external users.\r\n\r\n## GitHub App OAuth\r\n\r\nTo identify users on the frontend, I'm using GitHub OAuth. Cody has had a GitHub App since the beta when they were still called Integrations. Now that they're called Apps and have been released GA, I feel comfortable enough starting to use it more.\r\n\r\nCurrently I'm just using the App's OAuth token to identify users logging in through the frontend. I haven't figured out how best to use the backend features Apps offer, although there are many that would be useful and a great fit. My main problem is figuring out how to transition from my old personal token approach to use the App's tokens.","created_at":"2017-07-06T18:56:13Z","updated_at":"2017-07-06T19:16:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c1584e5981f1fb5f10c5bb533e50ab650907a327","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/aergonaut/cody/pulls/67/commits","review_comments_url":"https://api.github.com/repos/aergonaut/cody/pulls/67/comments","review_comment_url":"https://api.github.com/repos/aergonaut/cody/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aergonaut/cody/issues/67/comments","statuses_url":"https://api.github.com/repos/aergonaut/cody/statuses/e6015bdf6d8f93bbb3295d481dcb97c9a4d28cb7","head":{"label":"aergonaut:github_app_frontend","ref":"github_app_frontend","sha":"e6015bdf6d8f93bbb3295d481dcb97c9a4d28cb7","user":{"login":"aergonaut","id":284007,"avatar_url":"https://avatars3.githubusercontent.com/u/284007?v=3","gravatar_id":"","url":"https://api.github.com/users/aergonaut","html_url":"https://github.com/aergonaut","followers_url":"https://api.github.com/users/aergonaut/followers","following_url":"https://api.github.com/users/aergonaut/following{/other_user}","gists_url":"https://api.github.com/users/aergonaut/gists{/gist_id}","starred_url":"https://api.github.com/users/aergonaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aergonaut/subscriptions","organizations_url":"https://api.github.com/users/aergonaut/orgs","repos_url":"https://api.github.com/users/aergonaut/repos","events_url":"https://api.github.com/users/aergonaut/events{/privacy}","received_events_url":"https://api.github.com/users/aergonaut/received_events","type":"User","site_admin":false},"repo":{"id":48143718,"name":"cody","full_name":"aergonaut/cody","owner":{"login":"aergonaut","id":284007,"avatar_url":"https://avatars3.githubusercontent.com/u/284007?v=3","gravatar_id":"","url":"https://api.github.com/users/aergonaut","html_url":"https://github.com/aergonaut","followers_url":"https://api.github.com/users/aergonaut/followers","following_url":"https://api.github.com/users/aergonaut/following{/other_user}","gists_url":"https://api.github.com/users/aergonaut/gists{/gist_id}","starred_url":"https://api.github.com/users/aergonaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aergonaut/subscriptions","organizations_url":"https://api.github.com/users/aergonaut/orgs","repos_url":"https://api.github.com/users/aergonaut/repos","events_url":"https://api.github.com/users/aergonaut/events{/privacy}","received_events_url":"https://api.github.com/users/aergonaut/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/aergonaut/cody","description":"Your friendly neighborhood code review bot","fork":false,"url":"https://api.github.com/repos/aergonaut/cody","forks_url":"https://api.github.com/repos/aergonaut/cody/forks","keys_url":"https://api.github.com/repos/aergonaut/cody/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aergonaut/cody/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aergonaut/cody/teams","hooks_url":"https://api.github.com/repos/aergonaut/cody/hooks","issue_events_url":"https://api.github.com/repos/aergonaut/cody/issues/events{/number}","events_url":"https://api.github.com/repos/aergonaut/cody/events","assignees_url":"https://api.github.com/repos/aergonaut/cody/assignees{/user}","branches_url":"https://api.github.com/repos/aergonaut/cody/branches{/branch}","tags_url":"https://api.github.com/repos/aergonaut/cody/tags","blobs_url":"https://api.github.com/repos/aergonaut/cody/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aergonaut/cody/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aergonaut/cody/git/refs{/sha}","trees_url":"https://api.github.com/repos/aergonaut/cody/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aergonaut/cody/statuses/{sha}","languages_url":"https://api.github.com/repos/aergonaut/cody/languages","stargazers_url":"https://api.github.com/repos/aergonaut/cody/stargazers","contributors_url":"https://api.github.com/repos/aergonaut/cody/contributors","subscribers_url":"https://api.github.com/repos/aergonaut/cody/subscribers","subscription_url":"https://api.github.com/repos/aergonaut/cody/subscription","commits_url":"https://api.github.com/repos/aergonaut/cody/commits{/sha}","git_commits_url":"https://api.github.com/repos/aergonaut/cody/git/commits{/sha}","comments_url":"https://api.github.com/repos/aergonaut/cody/comments{/number}","issue_comment_url":"https://api.github.com/repos/aergonaut/cody/issues/comments{/number}","contents_url":"https://api.github.com/repos/aergonaut/cody/contents/{+path}","compare_url":"https://api.github.com/repos/aergonaut/cody/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aergonaut/cody/merges","archive_url":"https://api.github.com/repos/aergonaut/cody/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aergonaut/cody/downloads","issues_url":"https://api.github.com/repos/aergonaut/cody/issues{/number}","pulls_url":"https://api.github.com/repos/aergonaut/cody/pulls{/number}","milestones_url":"https://api.github.com/repos/aergonaut/cody/milestones{/number}","notifications_url":"https://api.github.com/repos/aergonaut/cody/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aergonaut/cody/labels{/name}","releases_url":"https://api.github.com/repos/aergonaut/cody/releases{/id}","deployments_url":"https://api.github.com/repos/aergonaut/cody/deployments","created_at":"2015-12-17T00:53:40Z","updated_at":"2017-06-19T14:26:05Z","pushed_at":"2017-07-06T19:16:18Z","git_url":"git://github.com/aergonaut/cody.git","ssh_url":"git@github.com:aergonaut/cody.git","clone_url":"https://github.com/aergonaut/cody.git","svn_url":"https://github.com/aergonaut/cody","homepage":"","size":209,"stargazers_count":16,"watchers_count":16,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":12,"mirror_url":null,"open_issues_count":22,"forks":12,"open_issues":22,"watchers":16,"default_branch":"master"}},"base":{"label":"aergonaut:master","ref":"master","sha":"243131976c271f7c387feb9ac3bd94bb09a675dd","user":{"login":"aergonaut","id":284007,"avatar_url":"https://avatars3.githubusercontent.com/u/284007?v=3","gravatar_id":"","url":"https://api.github.com/users/aergonaut","html_url":"https://github.com/aergonaut","followers_url":"https://api.github.com/users/aergonaut/followers","following_url":"https://api.github.com/users/aergonaut/following{/other_user}","gists_url":"https://api.github.com/users/aergonaut/gists{/gist_id}","starred_url":"https://api.github.com/users/aergonaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aergonaut/subscriptions","organizations_url":"https://api.github.com/users/aergonaut/orgs","repos_url":"https://api.github.com/users/aergonaut/repos","events_url":"https://api.github.com/users/aergonaut/events{/privacy}","received_events_url":"https://api.github.com/users/aergonaut/received_events","type":"User","site_admin":false},"repo":{"id":48143718,"name":"cody","full_name":"aergonaut/cody","owner":{"login":"aergonaut","id":284007,"avatar_url":"https://avatars3.githubusercontent.com/u/284007?v=3","gravatar_id":"","url":"https://api.github.com/users/aergonaut","html_url":"https://github.com/aergonaut","followers_url":"https://api.github.com/users/aergonaut/followers","following_url":"https://api.github.com/users/aergonaut/following{/other_user}","gists_url":"https://api.github.com/users/aergonaut/gists{/gist_id}","starred_url":"https://api.github.com/users/aergonaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aergonaut/subscriptions","organizations_url":"https://api.github.com/users/aergonaut/orgs","repos_url":"https://api.github.com/users/aergonaut/repos","events_url":"https://api.github.com/users/aergonaut/events{/privacy}","received_events_url":"https://api.github.com/users/aergonaut/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/aergonaut/cody","description":"Your friendly neighborhood code review bot","fork":false,"url":"https://api.github.com/repos/aergonaut/cody","forks_url":"https://api.github.com/repos/aergonaut/cody/forks","keys_url":"https://api.github.com/repos/aergonaut/cody/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aergonaut/cody/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aergonaut/cody/teams","hooks_url":"https://api.github.com/repos/aergonaut/cody/hooks","issue_events_url":"https://api.github.com/repos/aergonaut/cody/issues/events{/number}","events_url":"https://api.github.com/repos/aergonaut/cody/events","assignees_url":"https://api.github.com/repos/aergonaut/cody/assignees{/user}","branches_url":"https://api.github.com/repos/aergonaut/cody/branches{/branch}","tags_url":"https://api.github.com/repos/aergonaut/cody/tags","blobs_url":"https://api.github.com/repos/aergonaut/cody/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aergonaut/cody/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aergonaut/cody/git/refs{/sha}","trees_url":"https://api.github.com/repos/aergonaut/cody/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aergonaut/cody/statuses/{sha}","languages_url":"https://api.github.com/repos/aergonaut/cody/languages","stargazers_url":"https://api.github.com/repos/aergonaut/cody/stargazers","contributors_url":"https://api.github.com/repos/aergonaut/cody/contributors","subscribers_url":"https://api.github.com/repos/aergonaut/cody/subscribers","subscription_url":"https://api.github.com/repos/aergonaut/cody/subscription","commits_url":"https://api.github.com/repos/aergonaut/cody/commits{/sha}","git_commits_url":"https://api.github.com/repos/aergonaut/cody/git/commits{/sha}","comments_url":"https://api.github.com/repos/aergonaut/cody/comments{/number}","issue_comment_url":"https://api.github.com/repos/aergonaut/cody/issues/comments{/number}","contents_url":"https://api.github.com/repos/aergonaut/cody/contents/{+path}","compare_url":"https://api.github.com/repos/aergonaut/cody/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aergonaut/cody/merges","archive_url":"https://api.github.com/repos/aergonaut/cody/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aergonaut/cody/downloads","issues_url":"https://api.github.com/repos/aergonaut/cody/issues{/number}","pulls_url":"https://api.github.com/repos/aergonaut/cody/pulls{/number}","milestones_url":"https://api.github.com/repos/aergonaut/cody/milestones{/number}","notifications_url":"https://api.github.com/repos/aergonaut/cody/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aergonaut/cody/labels{/name}","releases_url":"https://api.github.com/repos/aergonaut/cody/releases{/id}","deployments_url":"https://api.github.com/repos/aergonaut/cody/deployments","created_at":"2015-12-17T00:53:40Z","updated_at":"2017-06-19T14:26:05Z","pushed_at":"2017-07-06T19:16:18Z","git_url":"git://github.com/aergonaut/cody.git","ssh_url":"git@github.com:aergonaut/cody.git","clone_url":"https://github.com/aergonaut/cody.git","svn_url":"https://github.com/aergonaut/cody","homepage":"","size":209,"stargazers_count":16,"watchers_count":16,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":12,"mirror_url":null,"open_issues_count":22,"forks":12,"open_issues":22,"watchers":16,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/67"},"html":{"href":"https://github.com/aergonaut/cody/pull/67"},"issue":{"href":"https://api.github.com/repos/aergonaut/cody/issues/67"},"comments":{"href":"https://api.github.com/repos/aergonaut/cody/issues/67/comments"},"review_comments":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/67/comments"},"review_comment":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aergonaut/cody/pulls/67/commits"},"statuses":{"href":"https://api.github.com/repos/aergonaut/cody/statuses/e6015bdf6d8f93bbb3295d481dcb97c9a4d28cb7"}}}}
{"actor":{"display_login":"houndci-bot"}}