{"action":"created","comment":{"url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/comments/244841194","pull_request_review_id":188791682,"id":244841194,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0NDg0MTE5NA==","diff_hunk":"@@ -0,0 +1,46 @@\n+const crypto = require('crypto')\n+const objectPath = require('object-path')\n+const { getReplyUserEmail, getReplyUserHash } = require('./utils')\n+const AccountsModel = require('../../src/models/authenticationAccountModel')\n+const { debug } = require('../logger')\n+\n+module.exports = async function migrateReplyUser(replyUser, options = {}) {\n+  const isDryRun = !!options.dryRun\n+\n+  if (objectPath.get(replyUser, 'services.authServiceId')) {\n+    throw new Error('Already migrated user (via push)')\n+  }\n+\n+  const newUser = await buildNewAccount(replyUser)\n+\n+  if (isDryRun) {\n+    await newUser.validate()\n+    debug('Dry run: creating user\\n', newUser)\n+  } else {\n+    await newUser.save()\n+    debug('New user created', newUser)\n+  }\n+\n+  return { ok: true, newUser }\n+}\n+\n+async function buildNewAccount(replyUser) {\n+  const fallbackEmail = `replyMigrated+${replyUser._id}@bufferapp.com`\n+  const email = getReplyUserEmail(replyUser) || fallbackEmail\n+\n+  const hashedPasswordReply = getReplyUserHash(replyUser)\n+  const newUser = new AccountsModel({\n+    email,\n+    hashedPasswordReply,\n+  })\n+\n+  newUser.productlinks.addToSet({\n+    productName: 'reply',\n+    foreignKey: replyUser._id,\n+  })\n+\n+  const randPassword = crypto.randomBytes(64).toString()\n+  await newUser.setPassword({ password: randPassword })","path":"migration/stage1/migrateReplyUser.js","position":43,"original_position":43,"commit_id":"c386ea806cabde66af3be4a8ed11d7b827f1041d","original_commit_id":"c386ea806cabde66af3be4a8ed11d7b827f1041d","user":{"login":"djfarrelly","id":1509457,"node_id":"MDQ6VXNlcjE1MDk0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1509457?v=4","gravatar_id":"","url":"https://api.github.com/users/djfarrelly","html_url":"https://github.com/djfarrelly","followers_url":"https://api.github.com/users/djfarrelly/followers","following_url":"https://api.github.com/users/djfarrelly/following{/other_user}","gists_url":"https://api.github.com/users/djfarrelly/gists{/gist_id}","starred_url":"https://api.github.com/users/djfarrelly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/djfarrelly/subscriptions","organizations_url":"https://api.github.com/users/djfarrelly/orgs","repos_url":"https://api.github.com/users/djfarrelly/repos","events_url":"https://api.github.com/users/djfarrelly/events{/privacy}","received_events_url":"https://api.github.com/users/djfarrelly/received_events","type":"User","site_admin":false},"body":"My guess is that this is what is causing the slowness as we're running `bcrypt.hash` in this method. To speed things up, should we just skip using `setPassword` and instead just use `newUser.password = randPassword`?\r\n\r\nI'll share my line of thinking here:\r\n\r\n- Running a test script using `hash`, it takes ~100ms for each call on average on my laptop. For 31391 documents that's ~52 minutes of time just for that\r\n- We're already migrating `hashedPasswordReply` and `password` is just a placeholder to ensure that we don't have an empty password if we every remove the Reply password logic from `verifyPassword` (This was my understanding from what you shared before Edu!)\r\n- If we drop support for the legacy Reply password hash, the flow mentioned previously would be to trigger a password reset to grant them access.\r\n- With the above in mind we do not need the `password` set here to be a valid password we can run `compare` on\r\n- If we just store the random byte string as `password` any future call to `compare` with it should always return false (Please question this assumption!)\r\n- We could prefix some fake salt so `compare` doesn't throw any errors, ex. `randPassword = 'fakesalt.' + crypto.randomBytes(64).toString()`\r\n- Running a test w/ dropping the hash of the random password for 1000 sets drops the execution time from `100792ms` to `35ms`.\r\n\r\nSo, overall, we're only creating dummy passwords in the database that we intend never to be used so why do we have the need to hash them? \r\n\r\n","created_at":"2019-01-02T20:12:16Z","updated_at":"2019-01-02T20:14:04Z","html_url":"https://github.com/bufferapp/core-authentication-service/pull/66#discussion_r244841194","pull_request_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/comments/244841194"},"html":{"href":"https://github.com/bufferapp/core-authentication-service/pull/66#discussion_r244841194"},"pull_request":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66"}}},"pull_request":{"url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66","id":239084381,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM5MDg0Mzgx","html_url":"https://github.com/bufferapp/core-authentication-service/pull/66","diff_url":"https://github.com/bufferapp/core-authentication-service/pull/66.diff","patch_url":"https://github.com/bufferapp/core-authentication-service/pull/66.patch","issue_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/66","number":66,"state":"open","locked":false,"title":"CORE-327 migration script stage 1","user":{"login":"esclapes","id":829971,"node_id":"MDQ6VXNlcjgyOTk3MQ==","avatar_url":"https://avatars1.githubusercontent.com/u/829971?v=4","gravatar_id":"","url":"https://api.github.com/users/esclapes","html_url":"https://github.com/esclapes","followers_url":"https://api.github.com/users/esclapes/followers","following_url":"https://api.github.com/users/esclapes/following{/other_user}","gists_url":"https://api.github.com/users/esclapes/gists{/gist_id}","starred_url":"https://api.github.com/users/esclapes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/esclapes/subscriptions","organizations_url":"https://api.github.com/users/esclapes/orgs","repos_url":"https://api.github.com/users/esclapes/repos","events_url":"https://api.github.com/users/esclapes/events{/privacy}","received_events_url":"https://api.github.com/users/esclapes/received_events","type":"User","site_admin":false},"body":"This includes the migration logic for _Stage 1_: aka importing reply users into the authentication service\r\n\r\n**You need to rebuild the container after checking out this branch for the `-slim` image to be used. Just run the `buffer-dev` command `./dev rebuild core-authentication-service`**\r\n\r\nThe script will prompt you to provice the Mongo URIs for source and destination databases. There is a provided default URI (`mongodb://localhost:27019/stage1Test`) for easy local testing.\r\n\r\nThe script has three modes:\r\n\r\n* **Sanity check**: will read the source DB for users that have been already pushed (aka have the `services.authServiceId` property set) and will check that there is a existing matching account and the email and product link are in sync. It will report how many records have been checked and the found errors.\r\n* **Dry run**: will do the sanity check plus it will iterated through all non-migrated reply users to simulate the migration without changing anny of the records. This means that the new account will be generated and validated in memory but not saved.\r\n* **The real thing**: will do the migration of non-migrated reply users, saving the newly generated accounts and updating the reply users collection to set the `services.authServiceId` value.\r\n\r\n## Test env setup\r\n\r\nThere are a few unit tests for the migration, but it is far from being 100% tested. To test you may want to set up a local env for running the migration. These steps worked for me:\r\n\r\n1. Create a mongo database called `stage1Test1` in the `core-authentication-service-mongo` container, which is exposed in `localhost:27017`. (I used compass for this step).\r\n2. Get an export of the source and destination collections (you will need a mongo URI with access to each database):\r\n```\r\nmkdir private\r\nmongoexport --uri $REPLY_MONGO_URI --collection users -o ./private/replyUserExport.nljson\r\nmongoexport --uri $AUTH_MONGO_URI --collection accounts -o ./private/authUserExport.nljson\r\n```\r\n3. Import the databases to your local database:\r\n```\r\nmongoimport --uri mongodb://localhost:27019/stage1Test --file ./private/replyUserExport.nljson --collection users\r\nmongoimport --uri mongodb://localhost:27019/stage1Test --file ./private/authDevUsers.nljson --collection accounts\r\n```\r\n4. Run the migration `npm run migrate:stage1` it can be run outside of the container as the script is independent of the local link.\r\n\r\n\r\n","created_at":"2018-12-17T09:57:03Z","updated_at":"2019-01-02T20:14:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7d9b5f358ef822ee7764f552487e218f7f943a50","assignee":null,"assignees":[],"requested_reviewers":[{"login":"philippemiguet","id":727592,"node_id":"MDQ6VXNlcjcyNzU5Mg==","avatar_url":"https://avatars2.githubusercontent.com/u/727592?v=4","gravatar_id":"","url":"https://api.github.com/users/philippemiguet","html_url":"https://github.com/philippemiguet","followers_url":"https://api.github.com/users/philippemiguet/followers","following_url":"https://api.github.com/users/philippemiguet/following{/other_user}","gists_url":"https://api.github.com/users/philippemiguet/gists{/gist_id}","starred_url":"https://api.github.com/users/philippemiguet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philippemiguet/subscriptions","organizations_url":"https://api.github.com/users/philippemiguet/orgs","repos_url":"https://api.github.com/users/philippemiguet/repos","events_url":"https://api.github.com/users/philippemiguet/events{/privacy}","received_events_url":"https://api.github.com/users/philippemiguet/received_events","type":"User","site_admin":false},{"login":"CoxyBoris","id":4578065,"node_id":"MDQ6VXNlcjQ1NzgwNjU=","avatar_url":"https://avatars0.githubusercontent.com/u/4578065?v=4","gravatar_id":"","url":"https://api.github.com/users/CoxyBoris","html_url":"https://github.com/CoxyBoris","followers_url":"https://api.github.com/users/CoxyBoris/followers","following_url":"https://api.github.com/users/CoxyBoris/following{/other_user}","gists_url":"https://api.github.com/users/CoxyBoris/gists{/gist_id}","starred_url":"https://api.github.com/users/CoxyBoris/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CoxyBoris/subscriptions","organizations_url":"https://api.github.com/users/CoxyBoris/orgs","repos_url":"https://api.github.com/users/CoxyBoris/repos","events_url":"https://api.github.com/users/CoxyBoris/events{/privacy}","received_events_url":"https://api.github.com/users/CoxyBoris/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66/commits","review_comments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66/comments","review_comment_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/66/comments","statuses_url":"https://api.github.com/repos/bufferapp/core-authentication-service/statuses/c386ea806cabde66af3be4a8ed11d7b827f1041d","head":{"label":"bufferapp:task/CORE-327-migration-script-stage-1","ref":"task/CORE-327-migration-script-stage-1","sha":"c386ea806cabde66af3be4a8ed11d7b827f1041d","user":{"login":"bufferapp","id":798826,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5ODgyNg==","avatar_url":"https://avatars0.githubusercontent.com/u/798826?v=4","gravatar_id":"","url":"https://api.github.com/users/bufferapp","html_url":"https://github.com/bufferapp","followers_url":"https://api.github.com/users/bufferapp/followers","following_url":"https://api.github.com/users/bufferapp/following{/other_user}","gists_url":"https://api.github.com/users/bufferapp/gists{/gist_id}","starred_url":"https://api.github.com/users/bufferapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bufferapp/subscriptions","organizations_url":"https://api.github.com/users/bufferapp/orgs","repos_url":"https://api.github.com/users/bufferapp/repos","events_url":"https://api.github.com/users/bufferapp/events{/privacy}","received_events_url":"https://api.github.com/users/bufferapp/received_events","type":"Organization","site_admin":false},"repo":{"id":127939778,"node_id":"MDEwOlJlcG9zaXRvcnkxMjc5Mzk3Nzg=","name":"core-authentication-service","full_name":"bufferapp/core-authentication-service","private":false,"owner":{"login":"bufferapp","id":798826,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5ODgyNg==","avatar_url":"https://avatars0.githubusercontent.com/u/798826?v=4","gravatar_id":"","url":"https://api.github.com/users/bufferapp","html_url":"https://github.com/bufferapp","followers_url":"https://api.github.com/users/bufferapp/followers","following_url":"https://api.github.com/users/bufferapp/following{/other_user}","gists_url":"https://api.github.com/users/bufferapp/gists{/gist_id}","starred_url":"https://api.github.com/users/bufferapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bufferapp/subscriptions","organizations_url":"https://api.github.com/users/bufferapp/orgs","repos_url":"https://api.github.com/users/bufferapp/repos","events_url":"https://api.github.com/users/bufferapp/events{/privacy}","received_events_url":"https://api.github.com/users/bufferapp/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/bufferapp/core-authentication-service","description":"Buffer Authentication Service","fork":false,"url":"https://api.github.com/repos/bufferapp/core-authentication-service","forks_url":"https://api.github.com/repos/bufferapp/core-authentication-service/forks","keys_url":"https://api.github.com/repos/bufferapp/core-authentication-service/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bufferapp/core-authentication-service/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bufferapp/core-authentication-service/teams","hooks_url":"https://api.github.com/repos/bufferapp/core-authentication-service/hooks","issue_events_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/events{/number}","events_url":"https://api.github.com/repos/bufferapp/core-authentication-service/events","assignees_url":"https://api.github.com/repos/bufferapp/core-authentication-service/assignees{/user}","branches_url":"https://api.github.com/repos/bufferapp/core-authentication-service/branches{/branch}","tags_url":"https://api.github.com/repos/bufferapp/core-authentication-service/tags","blobs_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/refs{/sha}","trees_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bufferapp/core-authentication-service/statuses/{sha}","languages_url":"https://api.github.com/repos/bufferapp/core-authentication-service/languages","stargazers_url":"https://api.github.com/repos/bufferapp/core-authentication-service/stargazers","contributors_url":"https://api.github.com/repos/bufferapp/core-authentication-service/contributors","subscribers_url":"https://api.github.com/repos/bufferapp/core-authentication-service/subscribers","subscription_url":"https://api.github.com/repos/bufferapp/core-authentication-service/subscription","commits_url":"https://api.github.com/repos/bufferapp/core-authentication-service/commits{/sha}","git_commits_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/commits{/sha}","comments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/comments{/number}","issue_comment_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/comments{/number}","contents_url":"https://api.github.com/repos/bufferapp/core-authentication-service/contents/{+path}","compare_url":"https://api.github.com/repos/bufferapp/core-authentication-service/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bufferapp/core-authentication-service/merges","archive_url":"https://api.github.com/repos/bufferapp/core-authentication-service/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bufferapp/core-authentication-service/downloads","issues_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues{/number}","pulls_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls{/number}","milestones_url":"https://api.github.com/repos/bufferapp/core-authentication-service/milestones{/number}","notifications_url":"https://api.github.com/repos/bufferapp/core-authentication-service/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bufferapp/core-authentication-service/labels{/name}","releases_url":"https://api.github.com/repos/bufferapp/core-authentication-service/releases{/id}","deployments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/deployments","created_at":"2018-04-03T16:53:07Z","updated_at":"2018-12-10T12:53:51Z","pushed_at":"2019-01-02T14:54:19Z","git_url":"git://github.com/bufferapp/core-authentication-service.git","ssh_url":"git@github.com:bufferapp/core-authentication-service.git","clone_url":"https://github.com/bufferapp/core-authentication-service.git","svn_url":"https://github.com/bufferapp/core-authentication-service","homepage":null,"size":832,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":1,"open_issues":2,"watchers":2,"default_branch":"master"}},"base":{"label":"bufferapp:master","ref":"master","sha":"5640cfb40afa2fbab2d5cbcbbe772729e6ed7379","user":{"login":"bufferapp","id":798826,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5ODgyNg==","avatar_url":"https://avatars0.githubusercontent.com/u/798826?v=4","gravatar_id":"","url":"https://api.github.com/users/bufferapp","html_url":"https://github.com/bufferapp","followers_url":"https://api.github.com/users/bufferapp/followers","following_url":"https://api.github.com/users/bufferapp/following{/other_user}","gists_url":"https://api.github.com/users/bufferapp/gists{/gist_id}","starred_url":"https://api.github.com/users/bufferapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bufferapp/subscriptions","organizations_url":"https://api.github.com/users/bufferapp/orgs","repos_url":"https://api.github.com/users/bufferapp/repos","events_url":"https://api.github.com/users/bufferapp/events{/privacy}","received_events_url":"https://api.github.com/users/bufferapp/received_events","type":"Organization","site_admin":false},"repo":{"id":127939778,"node_id":"MDEwOlJlcG9zaXRvcnkxMjc5Mzk3Nzg=","name":"core-authentication-service","full_name":"bufferapp/core-authentication-service","private":false,"owner":{"login":"bufferapp","id":798826,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5ODgyNg==","avatar_url":"https://avatars0.githubusercontent.com/u/798826?v=4","gravatar_id":"","url":"https://api.github.com/users/bufferapp","html_url":"https://github.com/bufferapp","followers_url":"https://api.github.com/users/bufferapp/followers","following_url":"https://api.github.com/users/bufferapp/following{/other_user}","gists_url":"https://api.github.com/users/bufferapp/gists{/gist_id}","starred_url":"https://api.github.com/users/bufferapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bufferapp/subscriptions","organizations_url":"https://api.github.com/users/bufferapp/orgs","repos_url":"https://api.github.com/users/bufferapp/repos","events_url":"https://api.github.com/users/bufferapp/events{/privacy}","received_events_url":"https://api.github.com/users/bufferapp/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/bufferapp/core-authentication-service","description":"Buffer Authentication Service","fork":false,"url":"https://api.github.com/repos/bufferapp/core-authentication-service","forks_url":"https://api.github.com/repos/bufferapp/core-authentication-service/forks","keys_url":"https://api.github.com/repos/bufferapp/core-authentication-service/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bufferapp/core-authentication-service/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bufferapp/core-authentication-service/teams","hooks_url":"https://api.github.com/repos/bufferapp/core-authentication-service/hooks","issue_events_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/events{/number}","events_url":"https://api.github.com/repos/bufferapp/core-authentication-service/events","assignees_url":"https://api.github.com/repos/bufferapp/core-authentication-service/assignees{/user}","branches_url":"https://api.github.com/repos/bufferapp/core-authentication-service/branches{/branch}","tags_url":"https://api.github.com/repos/bufferapp/core-authentication-service/tags","blobs_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/refs{/sha}","trees_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bufferapp/core-authentication-service/statuses/{sha}","languages_url":"https://api.github.com/repos/bufferapp/core-authentication-service/languages","stargazers_url":"https://api.github.com/repos/bufferapp/core-authentication-service/stargazers","contributors_url":"https://api.github.com/repos/bufferapp/core-authentication-service/contributors","subscribers_url":"https://api.github.com/repos/bufferapp/core-authentication-service/subscribers","subscription_url":"https://api.github.com/repos/bufferapp/core-authentication-service/subscription","commits_url":"https://api.github.com/repos/bufferapp/core-authentication-service/commits{/sha}","git_commits_url":"https://api.github.com/repos/bufferapp/core-authentication-service/git/commits{/sha}","comments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/comments{/number}","issue_comment_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/comments{/number}","contents_url":"https://api.github.com/repos/bufferapp/core-authentication-service/contents/{+path}","compare_url":"https://api.github.com/repos/bufferapp/core-authentication-service/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bufferapp/core-authentication-service/merges","archive_url":"https://api.github.com/repos/bufferapp/core-authentication-service/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bufferapp/core-authentication-service/downloads","issues_url":"https://api.github.com/repos/bufferapp/core-authentication-service/issues{/number}","pulls_url":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls{/number}","milestones_url":"https://api.github.com/repos/bufferapp/core-authentication-service/milestones{/number}","notifications_url":"https://api.github.com/repos/bufferapp/core-authentication-service/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bufferapp/core-authentication-service/labels{/name}","releases_url":"https://api.github.com/repos/bufferapp/core-authentication-service/releases{/id}","deployments_url":"https://api.github.com/repos/bufferapp/core-authentication-service/deployments","created_at":"2018-04-03T16:53:07Z","updated_at":"2018-12-10T12:53:51Z","pushed_at":"2019-01-02T14:54:19Z","git_url":"git://github.com/bufferapp/core-authentication-service.git","ssh_url":"git@github.com:bufferapp/core-authentication-service.git","clone_url":"https://github.com/bufferapp/core-authentication-service.git","svn_url":"https://github.com/bufferapp/core-authentication-service","homepage":null,"size":832,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":1,"open_issues":2,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66"},"html":{"href":"https://github.com/bufferapp/core-authentication-service/pull/66"},"issue":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/66"},"comments":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/issues/66/comments"},"review_comments":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66/comments"},"review_comment":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/pulls/66/commits"},"statuses":{"href":"https://api.github.com/repos/bufferapp/core-authentication-service/statuses/c386ea806cabde66af3be4a8ed11d7b827f1041d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"djfarrelly"}}