{"action":"created","comment":{"url":"https://api.github.com/repos/choice-form/rfcs/pulls/comments/95526257","pull_request_review_id":16082429,"id":95526257,"diff_hunk":"@@ -0,0 +1,407 @@\n+# I18n service API 设计\n+\n+\n+## Project\n+\n+Project 是 entries 的容器。每个 entry 必须属于一个 project 。project 有两种：\n+\n+- Global project ，系统默认创建的 project ，仅有一个，用于存放以 `global` 为顶层命名空间的 entries ，比如 `global.a.b.c` 。\n+- 用户创建的 project ，每个应用对应一个 project ，entries 各自独立，但都通过 global folder 共享 global project 下面的 entries 。\n+\n+Project 的主要属性有 `id` 和 `name` 。`id` 是 project 的唯一标识符，`name` 是用于显示的名字。\n+\n+注解：之前设计中有考虑把 `name` 作为用户设定的 project 唯一标识符。我觉得这种方式不如自增长 id 或者 uuid 。原因是用户设定的标识符容易被重用。比如某个叫 `editor` 的 project 被删除了，然后又新建了一个同名 project 。两个 project 其实并不相同，但拿 `name` 作为唯一标识符可能导致一些验证方面的漏洞，比如在采用 OAuth 2.0 这种只认资源权限不认用户或组织的校验方式中，以上情况容易让人突然可以访问其他用户的 project 。\n+\n+### 获取所有 projects\n+\n+```\n+GET /v1/projects\n+```\n+\n+返回 200 ，response body 为 project 列表。\n+\n+```json\n+{\n+  \"data\": [\n+    {\n+      \"id\": 1,\n+      \"name\": \"Q\"\n+    },\n+    {\n+      \"id\": 2,\n+      \"name\": \"Editor\"\n+    }\n+  ]\n+}\n+```\n+\n+### 获取单个 project\n+\n+`pid` 是 project id ，设计时可以为自增长的 number 或者 uuid 。\n+\n+```\n+GET /v1/projects/:pid\n+```\n+\n+返回 200 ，response body 为 project 。\n+\n+### 获取 global project\n+\n+简化 global project 的获取。如果 global project 的 id 为 5 ，以下等同于 `GET /v1/projects/5` 。\n+\n+```\n+GET /v1/projects/global\n+```\n+\n+返回 200 ，response body 为 project 。\n+\n+### 创建 project\n+\n+```\n+POST /v1/projects\n+\n+{\n+  \"name\": \"Design\"\n+}\n+```\n+\n+返回 201 ，response body 为 project 。\n+\n+### 更新 project\n+\n+```\n+PUT /v1/projects/:pid\n+\n+{\n+  \"name\": \"Design\"\n+}\n+```\n+\n+返回 200 ，response body 为 project 。\n+\n+### 删除 project\n+\n+```\n+DELETE /v1/projects/:pid\n+```\n+\n+返回 204 ，没有 response body 。\n+\n+\n+## Entry\n+\n+Entry 代表一个翻译词条。一个 entry 存放一个 key 和所有语言版本的翻译。支持的语言版本由系统决定。每个 entry 必须存放在某个 project 下，entry key 在该 project 下是唯一的。 project id + entry key 构成了 entry 的唯一标识符。\n+\n+Entry key 可以用 `.` 来划分 namespace ，比如 `common.button.ok` 。namespace 可以任意指定，但 `global` 这个 namespace 只能由 global project 下的 entries 使用。\n+\n+### 获取 project 下面的所有 entries\n+\n+获取所有 entry ，包含所有语言版本。\n+\n+```\n+GET /v1/projects/:pid/entries\n+```\n+\n+获取所有 entry ，限定中文和英文。\n+\n+```\n+GET /v1/projects/:pid/entries?lang=zh_cn,en_us\n+```\n+\n+返回\n+\n+```json\n+{\n+  \"data\": [\n+    {\n+      \"key\": \"common.button.ok\",\n+      \"values\": {\n+        \"en_us\": \"OK\",\n+        \"zh_cn\": \"确定\",\n+        \"zh_tw\": \"確定\",\n+      }\n+    }\n+  ]\n+}\n+```\n+\n+如果以后需要其他元数据，比如分页信息，可以在顶层加上 `meta` key ，value 限定为 object 。\n+\n+### 获取一个 entry\n+\n+```\n+GET /v1/projects/:pid/entries/:entry_key\n+GET /v1/projects/:pid/entries/:entry_key?lang=zh_cn\n+```\n+\n+### 创建或更新 entry\n+\n+根据 key 修改 entry，如果没有对应的 entry 就自动创建一个。客户端可选择上传对应语言版本的翻译，但不是必须的。如果不传任何数据，则值不作任何改变，如果触发自动创建，每项语言的值均为 `null` 。可以用 `folder_id` 指定所属的 folder 。\n+\n+返回的 status code 方面，自动创建 entry 返回 201，否则返回 200 。\n+\n+这个 API 可用于 UI 自动创建词条的 helper ，也可以用于 i18n service 内部的管理界面。\n+\n+```\n+PUT /v1/projects/:pid/entries/:entry_key\n+\n+{\n+  \"en_us\": \"OK\",\n+  \"zh_cn\": \"确定\"\n+}\n+```\n+\n+以下例子中为 `common.button.ok` 创建 entry 。\n+\n+```\n+POST /v1/projects/1/entries/common.button.ok\n+```\n+\n+返回 201\n+\n+```json\n+{\n+  \"key\": \"common.button.ok\",\n+  \"values\": {\n+    \"en_us\": null,\n+    \"zh_cn\": null,\n+    \"zh_tw\": null,\n+  }\n+}\n+```\n+\n+以下例子中为 `common.button.ok` 修改 en_us 和 zh_cn 的翻译文本。\n+\n+```\n+POST /v1/projects/1/entries/common.button.ok\n+```\n+\n+返回 200 ，response body 如下：\n+\n+```json\n+{\n+  \"key\": \"common.button.ok\",\n+  \"values\": {\n+    \"en_us\": \"OK\",\n+    \"zh_cn\": \"确定\"\n+  }\n+}\n+```\n+\n+返回 201 ，response body 如下：\n+\n+```json\n+{\n+  \"key\": \"common.button.ok\",\n+  \"values\": {\n+    \"en_us\": \"OK\",\n+    \"zh_cn\": \"确定\",\n+    \"zh_tw\": null,\n+  }\n+}\n+```\n+\n+以下例子中把 `common.button.ok` 的 zh_cn 翻译文本设置为 `null`。\n+\n+返回 200 ，response body 如下：\n+\n+```\n+POST /v1/projects/1/entries/common.button.ok\n+\n+{\n+  \"zh_cn\": null\n+}\n+```\n+\n+返回 200 ，response body 如下：\n+\n+```json\n+{\n+  \"key\": \"common.button.ok\",\n+  \"values\": {\n+    \"en_us\": \"OK\",\n+    \"zh_cn\": null,\n+    \"zh_tw\": null,\n+  }\n+}\n+```\n+\n+以下例子中把 `common.button.ok` 放到 id 为 1 的 folder 下。\n+\n+```json\n+POST /v1/projects/1/entries/common.button.ok\n+\n+{\n+  \"folder_id\": 1\n+}\n+```\n+\n+返回 200 ，response body 为 entry 。\n+\n+### 删除 entry\n+\n+删除 entry ，folder 中包含该 entry 的信息也会被删掉。\n+\n+```\n+DELETE /v1/projects/:pid/entries/:entry_key\n+```\n+\n+返回 204 ，没有 response body 。\n+\n+\n+## Entry output\n+\n+这个 API 专门给外部 app 使用，获取一个 project 下面的指定语言的所有 entry ，以 nested key 的形式输出，无分页。\n+\n+```\n+GET /v1/projects/:pid/entry_output/en_us\n+```\n+\n+返回\n+\n+```json\n+{\n+  \"common\": {\n+    \"button\": {\n+      \"ok\": \"OK\",\n+      \"cancel\": \"Cancel\"\n+    }\n+  }\n+}\n+```\n+\n+## Folder\n+\n+Folder 从属于一个 project ，用于为 entries 分组，每个 folder 用 `filter` 属性指定一种 entries 的筛选规则。目前有三种：\n+\n+1. `global` ，筛选 global entries 。\n+1. `all` ，筛选 project 下面的所有 entries ，不包括 global entries 。\n+1. `selection` ，根据 folder 存储的 entry keys 筛选指定的 entries 。\n+\n+global 和 all 两个 folders 均为自动创建，无法修改和删除。global project 包含一个 global folder ，且不能创建任何其他 folders 。其他 project 创建时会自动生成 global 和 all 两个 folders ，用户可以创建 selection folders 。\n+\n+### 获取一个 project 下面的 folders\n+\n+```\n+GET /v1/projects/:pid/folders\n+```\n+\n+返回 200\n+\n+```json\n+{\n+  \"data\": [\n+    {\n+      \"id\": 1,\n+      \"name\": \"Global\",\n+      \"filter\": \"global\"\n+    },\n+    {\n+      \"id\": 2,\n+      \"name\": \"All\",\n+      \"filter\": \"all\"\n+    },\n+    {\n+      \"id\": 3,\n+      \"name\": \"Dashboard\",\n+      \"filter\": \"selection\"\n+    },\n+  ]\n+}\n+```\n+\n+### 获取 folder 下面的 entries\n+\n+```\n+GET /v1/folders/:fid/entries\n+```\n+\n+返回 200 ，response body 为 entry 列表。\n+\n+### 创建 folder\n+\n+创建的 folder 的 filter 均为 `selection` ，并且 `name` 不能跟同一 project 下的其他 folder 重名。\n+\n+```\n+POST /v1/folders\n+\n+{\n+  \"project_id\": 1,\n+  \"name\": \"Common\",\n+  \"entry_keys\": [\n+    \"common.button.ok\",\n+    \"common.button.cancel\"\n+  ]\n+}\n+```\n+\n+返回 201 ，response body 为 folder 。\n+\n+### 更新 folder\n+\n+可以更新 folder 的 `name` 和 `entry_keys` ，所有指定的属性均为替换而不是增量累加，没有指定的属性保持不变。\n+\n+```\n+PUT /v1/folders/:fid\n+\n+{\n+  \"name\": \"Common\",\n+  \"entry_keys\": [\n+    \"common.button.ok\"\n+  ]\n+}\n+```\n+\n+返回 200 ，response body 为 folder 。\n+\n+### 删除 folder\n+\n+删除 folder 。只能删除 selection folder 。\n+\n+```\n+DELETE /v1/folders/:fid\n+```\n+\n+返回 204 ，没有 response body 。\n+\n+\n+## 错误的返回值\n+\n+所有 API 发生错误时都遵循一下规范。\n+\n+错误的状态码有以下几种：\n+\n+- 当授权信息不正确时（比如 token 不正确，过期），返回 401 。\n+- 当授权正确但没有权限访问某资源时（比如访问其他组织的 project），返回 403 。\n+- 当指定的资源不存在时，返回 404 。\n+- 当 API 请求遇到错误时（比如参数不合法，校验错误），返回 422 。\n+\n+错误的 response body 有两种。\n+\n+当需要返回单条错误信息时，用以下格式。大多数情况都是这种格式。\n+\n+```json\n+{\n+  \"error\": {\n+    \"message\": \"Some error messages\"\n+  }\n+}\n+```\n+\n+当需要返回多条错误信息时，用以下格式。这种情况多发生在 422 校验错误。下面是创建 folder API 校验错误的情况。\n+\n+```json\n+{\n+  \"errors\": {\n+    \"name\": \"Name has already been taken\",\n+    \"entry_keys\": \"entries can't be blank\"\n+  }\n+}\n+```\n+\n+\n+## 问题\n+\n+- API 规范方面，要不要考虑 JSON API ？这样前端也许可以直接用 Ember Data 。后端或许要调研一下合适的方案。\n+- 当 response body 需要返回 folder 资源的情况下，folder 是否需要包含 entry_keys ？\n+- 如何更新 folder 的指定 entries ？比如添加或者删除某几个 entries 。是否需要这些功能？","path":"i18n-service-api.md","position":406,"original_position":407,"commit_id":"95422fa5c453b85ae4742b40d728f034daf6f34f","original_commit_id":"95422fa5c453b85ae4742b40d728f034daf6f34f","user":{"login":"darkbaby123","id":2097309,"avatar_url":"https://avatars.githubusercontent.com/u/2097309?v=3","gravatar_id":"","url":"https://api.github.com/users/darkbaby123","html_url":"https://github.com/darkbaby123","followers_url":"https://api.github.com/users/darkbaby123/followers","following_url":"https://api.github.com/users/darkbaby123/following{/other_user}","gists_url":"https://api.github.com/users/darkbaby123/gists{/gist_id}","starred_url":"https://api.github.com/users/darkbaby123/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/darkbaby123/subscriptions","organizations_url":"https://api.github.com/users/darkbaby123/orgs","repos_url":"https://api.github.com/users/darkbaby123/repos","events_url":"https://api.github.com/users/darkbaby123/events{/privacy}","received_events_url":"https://api.github.com/users/darkbaby123/received_events","type":"User","site_admin":false},"body":"entry 当然是在 project scope 下修改，实际上也只有这一种方式可以改。这个问题思考的是如何为 folder 和 entry 建立关联，而不是修改 entry 本身。\r\n\r\n一个例子就是，系统中有个 folder 叫 Buttons ，存放了所有 `button.xxx` 的 entry 。现在我新建了一个 entry 叫 `button.awesome` ，我如何把这个 entry 加到 folder 中去？","created_at":"2017-01-11T07:53:42Z","updated_at":"2017-01-11T07:53:42Z","html_url":"https://github.com/choice-form/rfcs/pull/1#discussion_r95526257","pull_request_url":"https://api.github.com/repos/choice-form/rfcs/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/comments/95526257"},"html":{"href":"https://github.com/choice-form/rfcs/pull/1#discussion_r95526257"},"pull_request":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/choice-form/rfcs/pulls/1","id":97460748,"html_url":"https://github.com/choice-form/rfcs/pull/1","diff_url":"https://github.com/choice-form/rfcs/pull/1.diff","patch_url":"https://github.com/choice-form/rfcs/pull/1.patch","issue_url":"https://api.github.com/repos/choice-form/rfcs/issues/1","number":1,"state":"open","locked":false,"title":"I18n service API","user":{"login":"darkbaby123","id":2097309,"avatar_url":"https://avatars.githubusercontent.com/u/2097309?v=3","gravatar_id":"","url":"https://api.github.com/users/darkbaby123","html_url":"https://github.com/darkbaby123","followers_url":"https://api.github.com/users/darkbaby123/followers","following_url":"https://api.github.com/users/darkbaby123/following{/other_user}","gists_url":"https://api.github.com/users/darkbaby123/gists{/gist_id}","starred_url":"https://api.github.com/users/darkbaby123/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/darkbaby123/subscriptions","organizations_url":"https://api.github.com/users/darkbaby123/orgs","repos_url":"https://api.github.com/users/darkbaby123/repos","events_url":"https://api.github.com/users/darkbaby123/events{/privacy}","received_events_url":"https://api.github.com/users/darkbaby123/received_events","type":"User","site_admin":false},"body":"I18n service 的 API 设计\r\n\r\n[全文阅读](https://github.com/choice-form/rfcs/blob/i18n-service-api/i18n-service-api.md)","created_at":"2016-12-11T14:39:23Z","updated_at":"2017-01-11T07:53:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bcc1465bc3b558d9ce7f163d4ab6811ab6e0894e","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/choice-form/rfcs/pulls/1/commits","review_comments_url":"https://api.github.com/repos/choice-form/rfcs/pulls/1/comments","review_comment_url":"https://api.github.com/repos/choice-form/rfcs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/choice-form/rfcs/issues/1/comments","statuses_url":"https://api.github.com/repos/choice-form/rfcs/statuses/95422fa5c453b85ae4742b40d728f034daf6f34f","head":{"label":"choice-form:i18n-service-api","ref":"i18n-service-api","sha":"95422fa5c453b85ae4742b40d728f034daf6f34f","user":{"login":"choice-form","id":12053581,"avatar_url":"https://avatars.githubusercontent.com/u/12053581?v=3","gravatar_id":"","url":"https://api.github.com/users/choice-form","html_url":"https://github.com/choice-form","followers_url":"https://api.github.com/users/choice-form/followers","following_url":"https://api.github.com/users/choice-form/following{/other_user}","gists_url":"https://api.github.com/users/choice-form/gists{/gist_id}","starred_url":"https://api.github.com/users/choice-form/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choice-form/subscriptions","organizations_url":"https://api.github.com/users/choice-form/orgs","repos_url":"https://api.github.com/users/choice-form/repos","events_url":"https://api.github.com/users/choice-form/events{/privacy}","received_events_url":"https://api.github.com/users/choice-form/received_events","type":"Organization","site_admin":false},"repo":{"id":76177280,"name":"rfcs","full_name":"choice-form/rfcs","owner":{"login":"choice-form","id":12053581,"avatar_url":"https://avatars.githubusercontent.com/u/12053581?v=3","gravatar_id":"","url":"https://api.github.com/users/choice-form","html_url":"https://github.com/choice-form","followers_url":"https://api.github.com/users/choice-form/followers","following_url":"https://api.github.com/users/choice-form/following{/other_user}","gists_url":"https://api.github.com/users/choice-form/gists{/gist_id}","starred_url":"https://api.github.com/users/choice-form/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choice-form/subscriptions","organizations_url":"https://api.github.com/users/choice-form/orgs","repos_url":"https://api.github.com/users/choice-form/repos","events_url":"https://api.github.com/users/choice-form/events{/privacy}","received_events_url":"https://api.github.com/users/choice-form/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/choice-form/rfcs","description":"Request of Commonts","fork":false,"url":"https://api.github.com/repos/choice-form/rfcs","forks_url":"https://api.github.com/repos/choice-form/rfcs/forks","keys_url":"https://api.github.com/repos/choice-form/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/choice-form/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/choice-form/rfcs/teams","hooks_url":"https://api.github.com/repos/choice-form/rfcs/hooks","issue_events_url":"https://api.github.com/repos/choice-form/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/choice-form/rfcs/events","assignees_url":"https://api.github.com/repos/choice-form/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/choice-form/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/choice-form/rfcs/tags","blobs_url":"https://api.github.com/repos/choice-form/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/choice-form/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/choice-form/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/choice-form/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/choice-form/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/choice-form/rfcs/languages","stargazers_url":"https://api.github.com/repos/choice-form/rfcs/stargazers","contributors_url":"https://api.github.com/repos/choice-form/rfcs/contributors","subscribers_url":"https://api.github.com/repos/choice-form/rfcs/subscribers","subscription_url":"https://api.github.com/repos/choice-form/rfcs/subscription","commits_url":"https://api.github.com/repos/choice-form/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/choice-form/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/choice-form/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/choice-form/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/choice-form/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/choice-form/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/choice-form/rfcs/merges","archive_url":"https://api.github.com/repos/choice-form/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/choice-form/rfcs/downloads","issues_url":"https://api.github.com/repos/choice-form/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/choice-form/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/choice-form/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/choice-form/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/choice-form/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/choice-form/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/choice-form/rfcs/deployments","created_at":"2016-12-11T13:51:56Z","updated_at":"2016-12-11T13:54:26Z","pushed_at":"2017-01-11T06:29:22Z","git_url":"git://github.com/choice-form/rfcs.git","ssh_url":"git@github.com:choice-form/rfcs.git","clone_url":"https://github.com/choice-form/rfcs.git","svn_url":"https://github.com/choice-form/rfcs","homepage":"","size":27,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":4,"forks":1,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"choice-form:master","ref":"master","sha":"d1accf6bc1a19792da90b25a00a77bbefd7120de","user":{"login":"choice-form","id":12053581,"avatar_url":"https://avatars.githubusercontent.com/u/12053581?v=3","gravatar_id":"","url":"https://api.github.com/users/choice-form","html_url":"https://github.com/choice-form","followers_url":"https://api.github.com/users/choice-form/followers","following_url":"https://api.github.com/users/choice-form/following{/other_user}","gists_url":"https://api.github.com/users/choice-form/gists{/gist_id}","starred_url":"https://api.github.com/users/choice-form/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choice-form/subscriptions","organizations_url":"https://api.github.com/users/choice-form/orgs","repos_url":"https://api.github.com/users/choice-form/repos","events_url":"https://api.github.com/users/choice-form/events{/privacy}","received_events_url":"https://api.github.com/users/choice-form/received_events","type":"Organization","site_admin":false},"repo":{"id":76177280,"name":"rfcs","full_name":"choice-form/rfcs","owner":{"login":"choice-form","id":12053581,"avatar_url":"https://avatars.githubusercontent.com/u/12053581?v=3","gravatar_id":"","url":"https://api.github.com/users/choice-form","html_url":"https://github.com/choice-form","followers_url":"https://api.github.com/users/choice-form/followers","following_url":"https://api.github.com/users/choice-form/following{/other_user}","gists_url":"https://api.github.com/users/choice-form/gists{/gist_id}","starred_url":"https://api.github.com/users/choice-form/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choice-form/subscriptions","organizations_url":"https://api.github.com/users/choice-form/orgs","repos_url":"https://api.github.com/users/choice-form/repos","events_url":"https://api.github.com/users/choice-form/events{/privacy}","received_events_url":"https://api.github.com/users/choice-form/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/choice-form/rfcs","description":"Request of Commonts","fork":false,"url":"https://api.github.com/repos/choice-form/rfcs","forks_url":"https://api.github.com/repos/choice-form/rfcs/forks","keys_url":"https://api.github.com/repos/choice-form/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/choice-form/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/choice-form/rfcs/teams","hooks_url":"https://api.github.com/repos/choice-form/rfcs/hooks","issue_events_url":"https://api.github.com/repos/choice-form/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/choice-form/rfcs/events","assignees_url":"https://api.github.com/repos/choice-form/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/choice-form/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/choice-form/rfcs/tags","blobs_url":"https://api.github.com/repos/choice-form/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/choice-form/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/choice-form/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/choice-form/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/choice-form/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/choice-form/rfcs/languages","stargazers_url":"https://api.github.com/repos/choice-form/rfcs/stargazers","contributors_url":"https://api.github.com/repos/choice-form/rfcs/contributors","subscribers_url":"https://api.github.com/repos/choice-form/rfcs/subscribers","subscription_url":"https://api.github.com/repos/choice-form/rfcs/subscription","commits_url":"https://api.github.com/repos/choice-form/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/choice-form/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/choice-form/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/choice-form/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/choice-form/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/choice-form/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/choice-form/rfcs/merges","archive_url":"https://api.github.com/repos/choice-form/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/choice-form/rfcs/downloads","issues_url":"https://api.github.com/repos/choice-form/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/choice-form/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/choice-form/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/choice-form/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/choice-form/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/choice-form/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/choice-form/rfcs/deployments","created_at":"2016-12-11T13:51:56Z","updated_at":"2016-12-11T13:54:26Z","pushed_at":"2017-01-11T06:29:22Z","git_url":"git://github.com/choice-form/rfcs.git","ssh_url":"git@github.com:choice-form/rfcs.git","clone_url":"https://github.com/choice-form/rfcs.git","svn_url":"https://github.com/choice-form/rfcs","homepage":"","size":27,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":4,"forks":1,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/1"},"html":{"href":"https://github.com/choice-form/rfcs/pull/1"},"issue":{"href":"https://api.github.com/repos/choice-form/rfcs/issues/1"},"comments":{"href":"https://api.github.com/repos/choice-form/rfcs/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/choice-form/rfcs/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/choice-form/rfcs/statuses/95422fa5c453b85ae4742b40d728f034daf6f34f"}}}}
{"actor":{"display_login":"darkbaby123"}}