{"action":"created","comment":{"url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/comments/39839787","id":39839787,"diff_hunk":"@@ -0,0 +1,195 @@\n+'use strict';\n+\n+var FeedMe = require('feedme');\n+var directly = require('directly');\n+var podcastModel = require('../models/podcast');\n+var podcastLegacyMapping = require('../lib/podcast-legacy-mapping');\n+\n+function PodcastUpdater(options) {\n+\tthis.options = options;\n+\tthis.cache = {};\n+}\n+\n+PodcastUpdater.prototype.init = function() {\n+\tvar chain = Promise.resolve();\n+\n+\tconsole.log('Starting to fetch feed ' + this.options.rssFeedUrl + '.');\n+\n+\t// Old podcasts maintain their existing IDs which tend to be URLs rather\n+\t// than GUIDs. We maintain CSV mappings for switching URLs to Acast GUIDs.\n+\tif (this.options.legacyMappingPath) {\n+\t\tchain = chain.then(this.loadLegacyMappingData.bind(this)).then(function(data) {\n+\t\t\tthis.legacyMappingData = data;\n+\t\t}.bind(this));\n+\t}\n+\n+\tif (!this.options.all) {\n+\t\tchain = chain.then(this.fetchLastUpdate.bind(this)).then(function(datetime) {\n+\t\t\tthis.cache.lastUpdateDatetime = datetime;\n+\t\t}.bind(this));\n+\t}\n+\n+\treturn chain\n+\t\t.then(this.fetchRssFeed.bind(this))\n+\t\t.then(this.processRssFeed.bind(this))\n+\t\t.catch(this.error.bind(this));\n+};\n+\n+PodcastUpdater.prototype.loadLegacyMappingData = function() {\n+\treturn podcastLegacyMapping.load(this.options.legacyMappingPath);\n+};\n+\n+PodcastUpdater.prototype.fetchLastUpdate = function() {\n+\tvar postBody = {\n+\t\tquery: {\n+\t\t\tmatch: {\n+\t\t\t\t'item.master.masterSource': this.options.rssFeedUrl\n+\t\t\t}\n+\t\t},\n+\t\tsort: {\n+\t\t\t'_timestamp': 'desc'\n+\t\t},\n+\t\t_source: [ '_lastUpdatedDateTime' ],\n+\t};\n+\n+\tvar payload = {\n+\t\tmethod: 'POST',\n+\t\ttimeout: 3000,\n+\t\tbody: JSON.stringify(postBody),\n+\t\theaders: { 'Content-Type': 'application/json' }\n+\t};\n+\n+\treturn fetch(this.options.elasticSearchUrl + '/v1_api_v2/item/_search', payload)\n+\t\t.then(function(response) {\n+\t\t\treturn response.json();\n+\t\t})\n+\t\t.then(function(data) {\n+\t\t\tif (data.error) {\n+\t\t\t\tthrow new Error(data.error);\n+\t\t\t}\n+\n+\t\t\tif (data.hits.total) {\n+\t\t\t\treturn new Date(data.hits.hits[0]._source._lastUpdatedDateTime);\n+\t\t\t}\n+\t\t});\n+};\n+\n+PodcastUpdater.prototype.fetchRssFeed = function() {\n+\tvar parser = new FeedMe(true);\n+\n+\treturn fetch(this.options.rssFeedUrl, { timeout: 3000 })\n+\t\t.then(function(response) {\n+\t\t\treturn response.text();\n+\t\t})\n+\t\t.then(function(text) {\n+\t\t\tparser.on('error', function(err) {\n+\t\t\t\tthrow err;\n+\t\t\t});\n+\n+\t\t\tparser.write(text);\n+\n+\t\t\treturn parser.done();\n+\t\t});\n+};\n+\n+PodcastUpdater.prototype.processRssFeed = function(feed) {\n+\tvar items = feed.items;\n+\n+\tif (this.cache.lastUpdateDatetime) {\n+\t\tvar time = this.cache.lastUpdateDatetime.getTime();\n+\n+\t\titems = items.filter(function(item) {\n+\t\t\tvar published = new Date(item.pubdate);\n+\t\t\treturn !time || time < published.getTime();\n+\t\t});\n+\t}\n+\n+\tthis.cache.rssFeedMeta = {\n+\t\tdefaultImage: feed['itunes:image'].href,\n+\t\tmasterSource: this.options.rssFeedUrl,\n+\t\tbyline: feed['itunes:summary'],\n+\t\ttitle: feed.title\n+\t};\n+\n+\tconsole.log('' + items.length + ' podcast items to update.');\n+\n+\t// Directly throttles requests so we wrap each\n+\t// in a function to be called when ready.\n+\tvar cb = this.processRssFeedItem.bind(this);\n+\n+\treturn directly(10, items.map(function(item) {\n+\t\treturn function() {\n+\t\t\treturn cb(item).catch(function(err) {\n+\t\t\t\tconsole.error(err);\n+\t\t\t});\n+\t\t};\n+\t}));\n+};\n+\n+PodcastUpdater.prototype.processRssFeedItem = function(item) {\n+\n+\tvar postBody = {\n+\t\tdoc: podcastModel(item, this.cache.rssFeedMeta),\n+\t\tdoc_as_upsert: true\n+\t};\n+\n+\tvar id = postBody.doc.item.id;\n+\n+\tif (this.legacyMappingData && /^https?/.test(id)) {\n+\t\tvar guid = podcastLegacyMapping.find(this.legacyMappingData, id);\n+\n+\t\tif (guid) {\n+\t\t\tpostBody.doc.item.id = id = guid;\n+\t\t} else {\n+\t\t\treturn Promise.reject('New GUID could not be found for ' + id + '.');\n+\t\t}\n+\t}\n+\n+\tvar attempt = function(retries) {\n+\t\tretries = retries !== undefined ? retries : 3;\n+\n+\t\treturn this.updateRssFeedItem(id, postBody).catch(function(error) {\n+\t\t\tif (retries) {\n+\t\t\t\tconsole.log('' + id + ' failed to update, ' + retries + ' attempts remaining.');\n+\t\t\t\treturn attempt(--retries);\n+\t\t\t} else {\n+\t\t\t\tconsole.log('' + id + ' failed to update.');\n+\t\t\t}\n+\t\t});\n+\n+\t}.bind(this);\n+\n+\treturn attempt();\n+};\n+\n+PodcastUpdater.prototype.updateRssFeedItem = function(id, postBody) {\n+\tvar endpoint = this.options.elasticSearchUrl + '/v1_api_v2/item/' + id + '/_update';\n+\n+\tvar payload = {\n+\t\tmethod: 'POST',\n+\t\ttimeout: 3000,\n+\t\tbody: JSON.stringify(postBody),\n+\t\theaders: { 'Content-Type': 'application/json' }\n+\t};\n+\n+\tconsole.log('Indexing podcast ' + id + '.');\n+\n+\treturn fetch(endpoint, payload)\n+\t\t.then(function(response) {\n+\t\t\treturn response.json();\n+\t\t})\n+\t\t.then(function(data) {\n+\t\t\tif (data.error) {\n+\t\t\t\tthrow new Error(data.error);\n+\t\t\t}\n+\n+\t\t\tconsole.log('' + id + ' updated to version ' + data._version + '.');\n+\t\t\treturn Promise.resolve();\n+\t\t});\n+};\n+\n+PodcastUpdater.prototype.error = function(error) {\n+\tconsole.error(error.message || error);","path":"server/processes/podcast-updater.js","position":192,"original_position":192,"commit_id":"53717774a409e71bb076900340caccffc48296cf","original_commit_id":"53717774a409e71bb076900340caccffc48296cf","user":{"login":"i-like-robots","id":271645,"avatar_url":"https://avatars.githubusercontent.com/u/271645?v=3","gravatar_id":"","url":"https://api.github.com/users/i-like-robots","html_url":"https://github.com/i-like-robots","followers_url":"https://api.github.com/users/i-like-robots/followers","following_url":"https://api.github.com/users/i-like-robots/following{/other_user}","gists_url":"https://api.github.com/users/i-like-robots/gists{/gist_id}","starred_url":"https://api.github.com/users/i-like-robots/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i-like-robots/subscriptions","organizations_url":"https://api.github.com/users/i-like-robots/orgs","repos_url":"https://api.github.com/users/i-like-robots/repos","events_url":"https://api.github.com/users/i-like-robots/events{/privacy}","received_events_url":"https://api.github.com/users/i-like-robots/received_events","type":"User","site_admin":false},"body":"Pardon?","created_at":"2015-09-18T09:51:59Z","updated_at":"2015-09-18T09:51:59Z","html_url":"https://github.com/Financial-Times/next-harrier/pull/110#discussion_r39839787","pull_request_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110","_links":{"self":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/comments/39839787"},"html":{"href":"https://github.com/Financial-Times/next-harrier/pull/110#discussion_r39839787"},"pull_request":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110"}}},"pull_request":{"url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110","id":43411706,"html_url":"https://github.com/Financial-Times/next-harrier/pull/110","diff_url":"https://github.com/Financial-Times/next-harrier/pull/110.diff","patch_url":"https://github.com/Financial-Times/next-harrier/pull/110.patch","issue_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/110","number":110,"state":"open","locked":false,"title":"podcasts","user":{"login":"i-like-robots","id":271645,"avatar_url":"https://avatars.githubusercontent.com/u/271645?v=3","gravatar_id":"","url":"https://api.github.com/users/i-like-robots","html_url":"https://github.com/i-like-robots","followers_url":"https://api.github.com/users/i-like-robots/followers","following_url":"https://api.github.com/users/i-like-robots/following{/other_user}","gists_url":"https://api.github.com/users/i-like-robots/gists{/gist_id}","starred_url":"https://api.github.com/users/i-like-robots/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i-like-robots/subscriptions","organizations_url":"https://api.github.com/users/i-like-robots/orgs","repos_url":"https://api.github.com/users/i-like-robots/repos","events_url":"https://api.github.com/users/i-like-robots/events{/privacy}","received_events_url":"https://api.github.com/users/i-like-robots/received_events","type":"User","site_admin":false},"body":"- Fetches multiple RSS feeds for each show in series\r\n- For each feed it will take each episode, map it to the (V1) article model and insert them into ES in throttled batches\r\n- It maps each episode to meta data and old Podhoster IDs to new Acast GUIDs\r\n- It will attempt to update each episode up to 3 times\r\n- It can reindex all episodes or only add new shows\r\n\r\n<img width=\"1280\" alt=\"screen shot 2015-09-03 at 12 50 05\" src=\"https://cloud.githubusercontent.com/assets/271645/9657581/47410f18-523a-11e5-93e9-1c29892ecc66.png\">\r\n\r\nDepends on https://github.com/Financial-Times/next-feature-flags-api/pull/326 and https://github.com/Financial-Times/next-ft-api-client/pull/48\r\n","created_at":"2015-08-26T14:56:24Z","updated_at":"2015-09-18T09:51:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6a36b600309432d66654d82c10359b8d5e82d3a6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110/commits","review_comments_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110/comments","review_comment_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/110/comments","statuses_url":"https://api.github.com/repos/Financial-Times/next-harrier/statuses/53717774a409e71bb076900340caccffc48296cf","head":{"label":"Financial-Times:matth/podcasts","ref":"matth/podcasts","sha":"53717774a409e71bb076900340caccffc48296cf","user":{"login":"Financial-Times","id":3502508,"avatar_url":"https://avatars.githubusercontent.com/u/3502508?v=3","gravatar_id":"","url":"https://api.github.com/users/Financial-Times","html_url":"https://github.com/Financial-Times","followers_url":"https://api.github.com/users/Financial-Times/followers","following_url":"https://api.github.com/users/Financial-Times/following{/other_user}","gists_url":"https://api.github.com/users/Financial-Times/gists{/gist_id}","starred_url":"https://api.github.com/users/Financial-Times/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Financial-Times/subscriptions","organizations_url":"https://api.github.com/users/Financial-Times/orgs","repos_url":"https://api.github.com/users/Financial-Times/repos","events_url":"https://api.github.com/users/Financial-Times/events{/privacy}","received_events_url":"https://api.github.com/users/Financial-Times/received_events","type":"Organization","site_admin":false},"repo":{"id":26874532,"name":"next-harrier","full_name":"Financial-Times/next-harrier","owner":{"login":"Financial-Times","id":3502508,"avatar_url":"https://avatars.githubusercontent.com/u/3502508?v=3","gravatar_id":"","url":"https://api.github.com/users/Financial-Times","html_url":"https://github.com/Financial-Times","followers_url":"https://api.github.com/users/Financial-Times/followers","following_url":"https://api.github.com/users/Financial-Times/following{/other_user}","gists_url":"https://api.github.com/users/Financial-Times/gists{/gist_id}","starred_url":"https://api.github.com/users/Financial-Times/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Financial-Times/subscriptions","organizations_url":"https://api.github.com/users/Financial-Times/orgs","repos_url":"https://api.github.com/users/Financial-Times/repos","events_url":"https://api.github.com/users/Financial-Times/events{/privacy}","received_events_url":"https://api.github.com/users/Financial-Times/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Financial-Times/next-harrier","description":"Poll the V1 notifications API and update Elastic search","fork":false,"url":"https://api.github.com/repos/Financial-Times/next-harrier","forks_url":"https://api.github.com/repos/Financial-Times/next-harrier/forks","keys_url":"https://api.github.com/repos/Financial-Times/next-harrier/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Financial-Times/next-harrier/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Financial-Times/next-harrier/teams","hooks_url":"https://api.github.com/repos/Financial-Times/next-harrier/hooks","issue_events_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/events{/number}","events_url":"https://api.github.com/repos/Financial-Times/next-harrier/events","assignees_url":"https://api.github.com/repos/Financial-Times/next-harrier/assignees{/user}","branches_url":"https://api.github.com/repos/Financial-Times/next-harrier/branches{/branch}","tags_url":"https://api.github.com/repos/Financial-Times/next-harrier/tags","blobs_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/refs{/sha}","trees_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Financial-Times/next-harrier/statuses/{sha}","languages_url":"https://api.github.com/repos/Financial-Times/next-harrier/languages","stargazers_url":"https://api.github.com/repos/Financial-Times/next-harrier/stargazers","contributors_url":"https://api.github.com/repos/Financial-Times/next-harrier/contributors","subscribers_url":"https://api.github.com/repos/Financial-Times/next-harrier/subscribers","subscription_url":"https://api.github.com/repos/Financial-Times/next-harrier/subscription","commits_url":"https://api.github.com/repos/Financial-Times/next-harrier/commits{/sha}","git_commits_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/commits{/sha}","comments_url":"https://api.github.com/repos/Financial-Times/next-harrier/comments{/number}","issue_comment_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/comments{/number}","contents_url":"https://api.github.com/repos/Financial-Times/next-harrier/contents/{+path}","compare_url":"https://api.github.com/repos/Financial-Times/next-harrier/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Financial-Times/next-harrier/merges","archive_url":"https://api.github.com/repos/Financial-Times/next-harrier/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Financial-Times/next-harrier/downloads","issues_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues{/number}","pulls_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls{/number}","milestones_url":"https://api.github.com/repos/Financial-Times/next-harrier/milestones{/number}","notifications_url":"https://api.github.com/repos/Financial-Times/next-harrier/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Financial-Times/next-harrier/labels{/name}","releases_url":"https://api.github.com/repos/Financial-Times/next-harrier/releases{/id}","created_at":"2014-11-19T18:09:48Z","updated_at":"2015-05-06T13:20:42Z","pushed_at":"2015-09-17T09:28:53Z","git_url":"git://github.com/Financial-Times/next-harrier.git","ssh_url":"git@github.com:Financial-Times/next-harrier.git","clone_url":"https://github.com/Financial-Times/next-harrier.git","svn_url":"https://github.com/Financial-Times/next-harrier","homepage":null,"size":22793,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":12,"forks":0,"open_issues":12,"watchers":0,"default_branch":"master"}},"base":{"label":"Financial-Times:master","ref":"master","sha":"872fcbc8a01cca18e9cad50c8b461da0fdc21933","user":{"login":"Financial-Times","id":3502508,"avatar_url":"https://avatars.githubusercontent.com/u/3502508?v=3","gravatar_id":"","url":"https://api.github.com/users/Financial-Times","html_url":"https://github.com/Financial-Times","followers_url":"https://api.github.com/users/Financial-Times/followers","following_url":"https://api.github.com/users/Financial-Times/following{/other_user}","gists_url":"https://api.github.com/users/Financial-Times/gists{/gist_id}","starred_url":"https://api.github.com/users/Financial-Times/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Financial-Times/subscriptions","organizations_url":"https://api.github.com/users/Financial-Times/orgs","repos_url":"https://api.github.com/users/Financial-Times/repos","events_url":"https://api.github.com/users/Financial-Times/events{/privacy}","received_events_url":"https://api.github.com/users/Financial-Times/received_events","type":"Organization","site_admin":false},"repo":{"id":26874532,"name":"next-harrier","full_name":"Financial-Times/next-harrier","owner":{"login":"Financial-Times","id":3502508,"avatar_url":"https://avatars.githubusercontent.com/u/3502508?v=3","gravatar_id":"","url":"https://api.github.com/users/Financial-Times","html_url":"https://github.com/Financial-Times","followers_url":"https://api.github.com/users/Financial-Times/followers","following_url":"https://api.github.com/users/Financial-Times/following{/other_user}","gists_url":"https://api.github.com/users/Financial-Times/gists{/gist_id}","starred_url":"https://api.github.com/users/Financial-Times/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Financial-Times/subscriptions","organizations_url":"https://api.github.com/users/Financial-Times/orgs","repos_url":"https://api.github.com/users/Financial-Times/repos","events_url":"https://api.github.com/users/Financial-Times/events{/privacy}","received_events_url":"https://api.github.com/users/Financial-Times/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Financial-Times/next-harrier","description":"Poll the V1 notifications API and update Elastic search","fork":false,"url":"https://api.github.com/repos/Financial-Times/next-harrier","forks_url":"https://api.github.com/repos/Financial-Times/next-harrier/forks","keys_url":"https://api.github.com/repos/Financial-Times/next-harrier/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Financial-Times/next-harrier/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Financial-Times/next-harrier/teams","hooks_url":"https://api.github.com/repos/Financial-Times/next-harrier/hooks","issue_events_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/events{/number}","events_url":"https://api.github.com/repos/Financial-Times/next-harrier/events","assignees_url":"https://api.github.com/repos/Financial-Times/next-harrier/assignees{/user}","branches_url":"https://api.github.com/repos/Financial-Times/next-harrier/branches{/branch}","tags_url":"https://api.github.com/repos/Financial-Times/next-harrier/tags","blobs_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/refs{/sha}","trees_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Financial-Times/next-harrier/statuses/{sha}","languages_url":"https://api.github.com/repos/Financial-Times/next-harrier/languages","stargazers_url":"https://api.github.com/repos/Financial-Times/next-harrier/stargazers","contributors_url":"https://api.github.com/repos/Financial-Times/next-harrier/contributors","subscribers_url":"https://api.github.com/repos/Financial-Times/next-harrier/subscribers","subscription_url":"https://api.github.com/repos/Financial-Times/next-harrier/subscription","commits_url":"https://api.github.com/repos/Financial-Times/next-harrier/commits{/sha}","git_commits_url":"https://api.github.com/repos/Financial-Times/next-harrier/git/commits{/sha}","comments_url":"https://api.github.com/repos/Financial-Times/next-harrier/comments{/number}","issue_comment_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues/comments{/number}","contents_url":"https://api.github.com/repos/Financial-Times/next-harrier/contents/{+path}","compare_url":"https://api.github.com/repos/Financial-Times/next-harrier/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Financial-Times/next-harrier/merges","archive_url":"https://api.github.com/repos/Financial-Times/next-harrier/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Financial-Times/next-harrier/downloads","issues_url":"https://api.github.com/repos/Financial-Times/next-harrier/issues{/number}","pulls_url":"https://api.github.com/repos/Financial-Times/next-harrier/pulls{/number}","milestones_url":"https://api.github.com/repos/Financial-Times/next-harrier/milestones{/number}","notifications_url":"https://api.github.com/repos/Financial-Times/next-harrier/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Financial-Times/next-harrier/labels{/name}","releases_url":"https://api.github.com/repos/Financial-Times/next-harrier/releases{/id}","created_at":"2014-11-19T18:09:48Z","updated_at":"2015-05-06T13:20:42Z","pushed_at":"2015-09-17T09:28:53Z","git_url":"git://github.com/Financial-Times/next-harrier.git","ssh_url":"git@github.com:Financial-Times/next-harrier.git","clone_url":"https://github.com/Financial-Times/next-harrier.git","svn_url":"https://github.com/Financial-Times/next-harrier","homepage":null,"size":22793,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":12,"forks":0,"open_issues":12,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110"},"html":{"href":"https://github.com/Financial-Times/next-harrier/pull/110"},"issue":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/issues/110"},"comments":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/issues/110/comments"},"review_comments":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110/comments"},"review_comment":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/pulls/110/commits"},"statuses":{"href":"https://api.github.com/repos/Financial-Times/next-harrier/statuses/53717774a409e71bb076900340caccffc48296cf"}}}}