{"action":"created","comment":{"url":"https://api.github.com/repos/coralproject/shelf/pulls/comments/85428747","pull_request_review_id":6143529,"id":85428747,"diff_hunk":"@@ -102,3 +107,216 @@ func (formHandle) Delete(c *web.Context) error {\n \tc.Respond(nil, http.StatusOK)\n \treturn nil\n }\n+\n+//==============================================================================\n+\n+// AggregationKeys is a transport type that describes the json format for return value of the\n+// aggregate endpoint including a key lookup structure allowing consumers to easily find group keys.\n+type AggregationKeys struct {\n+\tAggregations map[string]form.Aggregation `json:\"aggregations\"`\n+}\n+\n+// Aggregate performs all aggregations across a form's submissions.\n+// 200 Success, 400 Bad Request, 404 Not Found, 500 Internal\n+func (formHandle) Aggregate(c *web.Context) error {\n+\tid := c.Params[\"form_id\"]\n+\n+\taggregations, err := form.AggregateFormSubmissions(c.SessionID, c.Ctx[\"DB\"].(*db.DB), id)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tak := AggregationKeys{\n+\t\tAggregations: aggregations,\n+\t}\n+\n+\tc.Respond(ak, http.StatusOK)\n+\n+\treturn nil\n+}\n+\n+// AggregateGroup performs all aggregations across a form's submissions and returns a single group.\n+// 200 Success, 400 Bad Request, 404 Not Found, 500 Internal\n+func (formHandle) AggregateGroup(c *web.Context) error {\n+\tid := c.Params[\"form_id\"]\n+\n+\taggregations, err := form.AggregateFormSubmissions(c.SessionID, c.Ctx[\"DB\"].(*db.DB), id)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\taggregation, ok := aggregations[c.Params[\"group_id\"]]\n+\tif !ok {\n+\t\tc.Respond(nil, http.StatusNotFound)\n+\t}\n+\n+\tc.Respond(aggregation, http.StatusOK)\n+\n+\treturn nil\n+}\n+\n+//==============================================================================\n+\n+// Form Digests: this section contains transport/bluprints for sending digests of form/question\n+// information to clients that do not need/won't understand full, vebose feeds.\n+\n+// FormQuestionOptionDigest is the blueprint for a single multiple choice option.\n+type FormQuestionOptionDigest struct {\n+\tID    string `json:\"id\" bson:\"id\"`\n+\tValue string `json:\"value\" bson:\"value\"`\n+}\n+\n+// FormQuestionDigest is the bluprint for a question in a form group.\n+type FormQuestionDigest struct {\n+\tID      string                     `json:\"id\" bson:\"id\"`\n+\tType    string                     `json:\"type\" bson:\"type\"`\n+\tTitle   string                     `json:\"title\" bson:\"title\"`\n+\tGroupBy bool                       `json:\"group_by\" bson:\"group_by\"`\n+\tOptions []FormQuestionOptionDigest `json:\"options,omitempty\" bson:\"options,omitempty\"`\n+\tOrder   int                        `json:\"order\" bson:\"order\"`\n+}\n+\n+// FormDigest is the blueprint for how we send form digests to clients.\n+type FormDigest struct {\n+\tQuestions map[string]FormQuestionDigest `json:\"questions\" bson:\"questions\"`\n+}\n+\n+// Digest returns a form digest.\n+// 200 Success, 400 Bad Request, 404 Not Found, 500 Internal\n+func (formHandle) Digest(c *web.Context) error {\n+\tid := c.Params[\"form_id\"]\n+\n+\t// Load the form requested.\n+\tf, err := form.Retrieve(c.SessionID, c.Ctx[\"DB\"].(*db.DB), id)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\t// Create a container for the question digests.\n+\tquestions := make(map[string]FormQuestionDigest)\n+\n+\t// Order is a counter to set the order questions in the form.\n+\torder := 1\n+\n+\t// Loop through to form's steps/widgets to find the questions.\n+\tfor _, step := range f.Steps {\n+\t\tfor _, widget := range step.Widgets {\n+\n+\t\t\t// Unpack the question properties.\n+\t\t\tprops := widget.Props.(bson.M)\n+\n+\t\t\t// We are looking to only include submissions with includeInGroups or groupSubmissions.\n+\t\t\tgs, gsok := props[\"groupSubmissions\"]\n+\t\t\tiig, iigok := props[\"includeInGroups\"]\n+\n+\t\t\t// Skip other questions, and do it verbosely to protect against messy data.\n+\t\t\tif (gs == nil || !gsok || gs == false) && (iig == nil || !iigok || iig == false) {\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\t// Include options for MultipleChoice questions.\n+\t\t\toptions := []FormQuestionOptionDigest{}\n+\t\t\tif widget.Component == \"MultipleChoice\" {\n+\n+\t\t\t\t// Step outside the safety of the type system...\n+\t\t\t\topts := props[\"options\"].([]interface{})\n+\n+\t\t\t\tfor _, opt := range opts {\n+\t\t\t\t\toption := opt.(bson.M)\n+\n+\t\t\t\t\t// Hash the answer text for a unique key, as no actual key exists.\n+\t\t\t\t\thasher := md5.New()\n+\t\t\t\t\thasher.Write([]byte(option[\"title\"].(string)))\n+\t\t\t\t\toptKeyStr := hex.EncodeToString(hasher.Sum(nil))\n+\n+\t\t\t\t\t// Add this option to the array.\n+\t\t\t\t\toptions = append(options, FormQuestionOptionDigest{\n+\t\t\t\t\t\tID:    optKeyStr,\n+\t\t\t\t\t\tValue: option[\"title\"].(string),\n+\t\t\t\t\t})\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\t// Add the question to the digest.\n+\t\t\tquestions[widget.ID] = FormQuestionDigest{\n+\t\t\t\tID:      widget.ID,\n+\t\t\t\tType:    widget.Component,\n+\t\t\t\tTitle:   widget.Title,\n+\t\t\t\tGroupBy: gsok,\n+\t\t\t\tOptions: options,\n+\t\t\t\tOrder:   order,\n+\t\t\t}\n+\n+\t\t\t// Increment the order counter.\n+\t\t\torder = order + 1\n+","path":"cmd/askd/handlers/form.go","position":165,"original_position":165,"commit_id":"20b0c1db901839872ea92c677eca00e4816c6f1e","original_commit_id":"20b0c1db901839872ea92c677eca00e4816c6f1e","user":{"login":"dwhitena","id":4524535,"avatar_url":"https://avatars.githubusercontent.com/u/4524535?v=3","gravatar_id":"","url":"https://api.github.com/users/dwhitena","html_url":"https://github.com/dwhitena","followers_url":"https://api.github.com/users/dwhitena/followers","following_url":"https://api.github.com/users/dwhitena/following{/other_user}","gists_url":"https://api.github.com/users/dwhitena/gists{/gist_id}","starred_url":"https://api.github.com/users/dwhitena/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dwhitena/subscriptions","organizations_url":"https://api.github.com/users/dwhitena/orgs","repos_url":"https://api.github.com/users/dwhitena/repos","events_url":"https://api.github.com/users/dwhitena/events{/privacy}","received_events_url":"https://api.github.com/users/dwhitena/received_events","type":"User","site_admin":false},"body":"Remove extra space.","created_at":"2016-10-27T21:12:14Z","updated_at":"2016-10-27T21:12:14Z","html_url":"https://github.com/coralproject/shelf/pull/294#discussion_r85428747","pull_request_url":"https://api.github.com/repos/coralproject/shelf/pulls/294","_links":{"self":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/comments/85428747"},"html":{"href":"https://github.com/coralproject/shelf/pull/294#discussion_r85428747"},"pull_request":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/294"}}},"pull_request":{"url":"https://api.github.com/repos/coralproject/shelf/pulls/294","id":90118602,"html_url":"https://github.com/coralproject/shelf/pull/294","diff_url":"https://github.com/coralproject/shelf/pull/294.diff","patch_url":"https://github.com/coralproject/shelf/pull/294.patch","issue_url":"https://api.github.com/repos/coralproject/shelf/issues/294","number":294,"state":"open","locked":false,"title":"[BOCOUP] Askd form submission grouping and aggregations.","user":{"login":"jde","id":259957,"avatar_url":"https://avatars.githubusercontent.com/u/259957?v=3","gravatar_id":"","url":"https://api.github.com/users/jde","html_url":"https://github.com/jde","followers_url":"https://api.github.com/users/jde/followers","following_url":"https://api.github.com/users/jde/following{/other_user}","gists_url":"https://api.github.com/users/jde/gists{/gist_id}","starred_url":"https://api.github.com/users/jde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jde/subscriptions","organizations_url":"https://api.github.com/users/jde/orgs","repos_url":"https://api.github.com/users/jde/repos","events_url":"https://api.github.com/users/jde/events{/privacy}","received_events_url":"https://api.github.com/users/jde/received_events","type":"User","site_admin":false},"body":"This pr contains an askd endpoint and internal code that runs a series of aggregations on submissions to a form in total and grouped by answers to multiple choice questions.","created_at":"2016-10-20T01:17:52Z","updated_at":"2016-10-27T21:32:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":{"login":"jde","id":259957,"avatar_url":"https://avatars.githubusercontent.com/u/259957?v=3","gravatar_id":"","url":"https://api.github.com/users/jde","html_url":"https://github.com/jde","followers_url":"https://api.github.com/users/jde/followers","following_url":"https://api.github.com/users/jde/following{/other_user}","gists_url":"https://api.github.com/users/jde/gists{/gist_id}","starred_url":"https://api.github.com/users/jde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jde/subscriptions","organizations_url":"https://api.github.com/users/jde/orgs","repos_url":"https://api.github.com/users/jde/repos","events_url":"https://api.github.com/users/jde/events{/privacy}","received_events_url":"https://api.github.com/users/jde/received_events","type":"User","site_admin":false},"assignees":[{"login":"jde","id":259957,"avatar_url":"https://avatars.githubusercontent.com/u/259957?v=3","gravatar_id":"","url":"https://api.github.com/users/jde","html_url":"https://github.com/jde","followers_url":"https://api.github.com/users/jde/followers","following_url":"https://api.github.com/users/jde/following{/other_user}","gists_url":"https://api.github.com/users/jde/gists{/gist_id}","starred_url":"https://api.github.com/users/jde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jde/subscriptions","organizations_url":"https://api.github.com/users/jde/orgs","repos_url":"https://api.github.com/users/jde/repos","events_url":"https://api.github.com/users/jde/events{/privacy}","received_events_url":"https://api.github.com/users/jde/received_events","type":"User","site_admin":false},{"login":"wyattjoh","id":633002,"avatar_url":"https://avatars.githubusercontent.com/u/633002?v=3","gravatar_id":"","url":"https://api.github.com/users/wyattjoh","html_url":"https://github.com/wyattjoh","followers_url":"https://api.github.com/users/wyattjoh/followers","following_url":"https://api.github.com/users/wyattjoh/following{/other_user}","gists_url":"https://api.github.com/users/wyattjoh/gists{/gist_id}","starred_url":"https://api.github.com/users/wyattjoh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wyattjoh/subscriptions","organizations_url":"https://api.github.com/users/wyattjoh/orgs","repos_url":"https://api.github.com/users/wyattjoh/repos","events_url":"https://api.github.com/users/wyattjoh/events{/privacy}","received_events_url":"https://api.github.com/users/wyattjoh/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/coralproject/shelf/pulls/294/commits","review_comments_url":"https://api.github.com/repos/coralproject/shelf/pulls/294/comments","review_comment_url":"https://api.github.com/repos/coralproject/shelf/pulls/comments{/number}","comments_url":"https://api.github.com/repos/coralproject/shelf/issues/294/comments","statuses_url":"https://api.github.com/repos/coralproject/shelf/statuses/20b0c1db901839872ea92c677eca00e4816c6f1e","head":{"label":"coralproject:coral-bocoup","ref":"coral-bocoup","sha":"20b0c1db901839872ea92c677eca00e4816c6f1e","user":{"login":"coralproject","id":9255912,"avatar_url":"https://avatars.githubusercontent.com/u/9255912?v=3","gravatar_id":"","url":"https://api.github.com/users/coralproject","html_url":"https://github.com/coralproject","followers_url":"https://api.github.com/users/coralproject/followers","following_url":"https://api.github.com/users/coralproject/following{/other_user}","gists_url":"https://api.github.com/users/coralproject/gists{/gist_id}","starred_url":"https://api.github.com/users/coralproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coralproject/subscriptions","organizations_url":"https://api.github.com/users/coralproject/orgs","repos_url":"https://api.github.com/users/coralproject/repos","events_url":"https://api.github.com/users/coralproject/events{/privacy}","received_events_url":"https://api.github.com/users/coralproject/received_events","type":"Organization","site_admin":false},"repo":{"id":45942185,"name":"shelf","full_name":"coralproject/shelf","owner":{"login":"coralproject","id":9255912,"avatar_url":"https://avatars.githubusercontent.com/u/9255912?v=3","gravatar_id":"","url":"https://api.github.com/users/coralproject","html_url":"https://github.com/coralproject","followers_url":"https://api.github.com/users/coralproject/followers","following_url":"https://api.github.com/users/coralproject/following{/other_user}","gists_url":"https://api.github.com/users/coralproject/gists{/gist_id}","starred_url":"https://api.github.com/users/coralproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coralproject/subscriptions","organizations_url":"https://api.github.com/users/coralproject/orgs","repos_url":"https://api.github.com/users/coralproject/repos","events_url":"https://api.github.com/users/coralproject/events{/privacy}","received_events_url":"https://api.github.com/users/coralproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/coralproject/shelf","description":"The home of all Coral Project services written in Golang","fork":false,"url":"https://api.github.com/repos/coralproject/shelf","forks_url":"https://api.github.com/repos/coralproject/shelf/forks","keys_url":"https://api.github.com/repos/coralproject/shelf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/coralproject/shelf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/coralproject/shelf/teams","hooks_url":"https://api.github.com/repos/coralproject/shelf/hooks","issue_events_url":"https://api.github.com/repos/coralproject/shelf/issues/events{/number}","events_url":"https://api.github.com/repos/coralproject/shelf/events","assignees_url":"https://api.github.com/repos/coralproject/shelf/assignees{/user}","branches_url":"https://api.github.com/repos/coralproject/shelf/branches{/branch}","tags_url":"https://api.github.com/repos/coralproject/shelf/tags","blobs_url":"https://api.github.com/repos/coralproject/shelf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/coralproject/shelf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/coralproject/shelf/git/refs{/sha}","trees_url":"https://api.github.com/repos/coralproject/shelf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/coralproject/shelf/statuses/{sha}","languages_url":"https://api.github.com/repos/coralproject/shelf/languages","stargazers_url":"https://api.github.com/repos/coralproject/shelf/stargazers","contributors_url":"https://api.github.com/repos/coralproject/shelf/contributors","subscribers_url":"https://api.github.com/repos/coralproject/shelf/subscribers","subscription_url":"https://api.github.com/repos/coralproject/shelf/subscription","commits_url":"https://api.github.com/repos/coralproject/shelf/commits{/sha}","git_commits_url":"https://api.github.com/repos/coralproject/shelf/git/commits{/sha}","comments_url":"https://api.github.com/repos/coralproject/shelf/comments{/number}","issue_comment_url":"https://api.github.com/repos/coralproject/shelf/issues/comments{/number}","contents_url":"https://api.github.com/repos/coralproject/shelf/contents/{+path}","compare_url":"https://api.github.com/repos/coralproject/shelf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/coralproject/shelf/merges","archive_url":"https://api.github.com/repos/coralproject/shelf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/coralproject/shelf/downloads","issues_url":"https://api.github.com/repos/coralproject/shelf/issues{/number}","pulls_url":"https://api.github.com/repos/coralproject/shelf/pulls{/number}","milestones_url":"https://api.github.com/repos/coralproject/shelf/milestones{/number}","notifications_url":"https://api.github.com/repos/coralproject/shelf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/coralproject/shelf/labels{/name}","releases_url":"https://api.github.com/repos/coralproject/shelf/releases{/id}","deployments_url":"https://api.github.com/repos/coralproject/shelf/deployments","created_at":"2015-11-10T21:43:59Z","updated_at":"2016-10-25T16:28:46Z","pushed_at":"2016-10-27T20:35:28Z","git_url":"git://github.com/coralproject/shelf.git","ssh_url":"git@github.com:coralproject/shelf.git","clone_url":"https://github.com/coralproject/shelf.git","svn_url":"https://github.com/coralproject/shelf","homepage":"","size":14910,"stargazers_count":41,"watchers_count":41,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":9,"mirror_url":null,"open_issues_count":17,"forks":9,"open_issues":17,"watchers":41,"default_branch":"master"}},"base":{"label":"coralproject:master","ref":"master","sha":"0783c0d793d6f4ca9a129f925bf800642c37eb1c","user":{"login":"coralproject","id":9255912,"avatar_url":"https://avatars.githubusercontent.com/u/9255912?v=3","gravatar_id":"","url":"https://api.github.com/users/coralproject","html_url":"https://github.com/coralproject","followers_url":"https://api.github.com/users/coralproject/followers","following_url":"https://api.github.com/users/coralproject/following{/other_user}","gists_url":"https://api.github.com/users/coralproject/gists{/gist_id}","starred_url":"https://api.github.com/users/coralproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coralproject/subscriptions","organizations_url":"https://api.github.com/users/coralproject/orgs","repos_url":"https://api.github.com/users/coralproject/repos","events_url":"https://api.github.com/users/coralproject/events{/privacy}","received_events_url":"https://api.github.com/users/coralproject/received_events","type":"Organization","site_admin":false},"repo":{"id":45942185,"name":"shelf","full_name":"coralproject/shelf","owner":{"login":"coralproject","id":9255912,"avatar_url":"https://avatars.githubusercontent.com/u/9255912?v=3","gravatar_id":"","url":"https://api.github.com/users/coralproject","html_url":"https://github.com/coralproject","followers_url":"https://api.github.com/users/coralproject/followers","following_url":"https://api.github.com/users/coralproject/following{/other_user}","gists_url":"https://api.github.com/users/coralproject/gists{/gist_id}","starred_url":"https://api.github.com/users/coralproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coralproject/subscriptions","organizations_url":"https://api.github.com/users/coralproject/orgs","repos_url":"https://api.github.com/users/coralproject/repos","events_url":"https://api.github.com/users/coralproject/events{/privacy}","received_events_url":"https://api.github.com/users/coralproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/coralproject/shelf","description":"The home of all Coral Project services written in Golang","fork":false,"url":"https://api.github.com/repos/coralproject/shelf","forks_url":"https://api.github.com/repos/coralproject/shelf/forks","keys_url":"https://api.github.com/repos/coralproject/shelf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/coralproject/shelf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/coralproject/shelf/teams","hooks_url":"https://api.github.com/repos/coralproject/shelf/hooks","issue_events_url":"https://api.github.com/repos/coralproject/shelf/issues/events{/number}","events_url":"https://api.github.com/repos/coralproject/shelf/events","assignees_url":"https://api.github.com/repos/coralproject/shelf/assignees{/user}","branches_url":"https://api.github.com/repos/coralproject/shelf/branches{/branch}","tags_url":"https://api.github.com/repos/coralproject/shelf/tags","blobs_url":"https://api.github.com/repos/coralproject/shelf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/coralproject/shelf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/coralproject/shelf/git/refs{/sha}","trees_url":"https://api.github.com/repos/coralproject/shelf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/coralproject/shelf/statuses/{sha}","languages_url":"https://api.github.com/repos/coralproject/shelf/languages","stargazers_url":"https://api.github.com/repos/coralproject/shelf/stargazers","contributors_url":"https://api.github.com/repos/coralproject/shelf/contributors","subscribers_url":"https://api.github.com/repos/coralproject/shelf/subscribers","subscription_url":"https://api.github.com/repos/coralproject/shelf/subscription","commits_url":"https://api.github.com/repos/coralproject/shelf/commits{/sha}","git_commits_url":"https://api.github.com/repos/coralproject/shelf/git/commits{/sha}","comments_url":"https://api.github.com/repos/coralproject/shelf/comments{/number}","issue_comment_url":"https://api.github.com/repos/coralproject/shelf/issues/comments{/number}","contents_url":"https://api.github.com/repos/coralproject/shelf/contents/{+path}","compare_url":"https://api.github.com/repos/coralproject/shelf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/coralproject/shelf/merges","archive_url":"https://api.github.com/repos/coralproject/shelf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/coralproject/shelf/downloads","issues_url":"https://api.github.com/repos/coralproject/shelf/issues{/number}","pulls_url":"https://api.github.com/repos/coralproject/shelf/pulls{/number}","milestones_url":"https://api.github.com/repos/coralproject/shelf/milestones{/number}","notifications_url":"https://api.github.com/repos/coralproject/shelf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/coralproject/shelf/labels{/name}","releases_url":"https://api.github.com/repos/coralproject/shelf/releases{/id}","deployments_url":"https://api.github.com/repos/coralproject/shelf/deployments","created_at":"2015-11-10T21:43:59Z","updated_at":"2016-10-25T16:28:46Z","pushed_at":"2016-10-27T20:35:28Z","git_url":"git://github.com/coralproject/shelf.git","ssh_url":"git@github.com:coralproject/shelf.git","clone_url":"https://github.com/coralproject/shelf.git","svn_url":"https://github.com/coralproject/shelf","homepage":"","size":14910,"stargazers_count":41,"watchers_count":41,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":9,"mirror_url":null,"open_issues_count":17,"forks":9,"open_issues":17,"watchers":41,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/294"},"html":{"href":"https://github.com/coralproject/shelf/pull/294"},"issue":{"href":"https://api.github.com/repos/coralproject/shelf/issues/294"},"comments":{"href":"https://api.github.com/repos/coralproject/shelf/issues/294/comments"},"review_comments":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/294/comments"},"review_comment":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/coralproject/shelf/pulls/294/commits"},"statuses":{"href":"https://api.github.com/repos/coralproject/shelf/statuses/20b0c1db901839872ea92c677eca00e4816c6f1e"}}}}
{"actor":{"display_login":"dwhitena"}}