Skip to content

Commit

Permalink
Add GHE avatar fallback to Gravatar
Browse files Browse the repository at this point in the history
Requires node.js crypto (or browserify version) to do the md5 hash. Updates all interfaces and GraphQL queries to include the user email.
  • Loading branch information
kabel committed May 6, 2021
1 parent 49f6d15 commit 694cb51
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 5 deletions.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1441,6 +1441,8 @@
"@types/temp": "0.8.34",
"@typescript-eslint/eslint-plugin": "4.18.0",
"@typescript-eslint/parser": "4.18.0",
"buffer": "^6.0.3",
"crypto-browserify": "3.12.0",
"css-loader": "5.1.3",
"esbuild-loader": "2.10.0",
"eslint": "7.22.0",
Expand All @@ -1466,6 +1468,7 @@
"react-testing-library": "7.0.1",
"sinon": "9.0.0",
"source-map-support": "0.5.19",
"stream-browserify": "^3.0.0",
"style-loader": "2.0.0",
"svg-inline-loader": "^0.8.2",
"temp": "0.9.4",
Expand Down
3 changes: 3 additions & 0 deletions src/github/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export interface AbbreviatedIssueComment {
login: string;
avatarUrl: string;
url: string;
email?: string
};
body: string;
databaseId: number;
Expand Down Expand Up @@ -387,6 +388,8 @@ export interface PullRequest {
nodes: {
login: string;
url: string;
email: string;
avatarUrl: string;
}[];
};
author: {
Expand Down
66 changes: 66 additions & 0 deletions src/github/queries.gql
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ fragment Comment on IssueComment {
login
avatarUrl
url
... on User {
email
}
... on Organization {
email
}
}
url
body
Expand All @@ -72,6 +78,7 @@ fragment Commit on PullRequestCommit {
login
avatarUrl
url
email
}
}
committer {
Expand Down Expand Up @@ -107,6 +114,12 @@ fragment Review on PullRequestReview {
login
avatarUrl
url
... on User {
email
}
... on Organization {
email
}
}
state
body
Expand Down Expand Up @@ -189,6 +202,12 @@ fragment ReviewComment on PullRequestReviewComment {
login
avatarUrl
url
... on User {
email
}
... on Organization {
email
}
}
path
originalPosition
Expand Down Expand Up @@ -277,6 +296,12 @@ query PullRequest($owner: String!, $name: String!, $number: Int!) {
login
url
avatarUrl
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand Down Expand Up @@ -361,6 +386,12 @@ query Issue($owner: String!, $name: String!, $number: Int!) {
login
url
avatarUrl
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand Down Expand Up @@ -389,6 +420,12 @@ query IssueWithComments($owner: String!, $name: String!, $number: Int!) {
login
url
avatarUrl
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand All @@ -406,6 +443,12 @@ query IssueWithComments($owner: String!, $name: String!, $number: Int!) {
login
url
avatarUrl
... on User {
email
}
... on Organization {
email
}
}
body
databaseId
Expand Down Expand Up @@ -648,12 +691,19 @@ query IssuesWithoutMilestone($owner: String!, $name: String!, $assignee: String!
nodes {
login
url
email
}
}
author {
login
url
avatarUrl(size: 50)
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand Down Expand Up @@ -719,6 +769,8 @@ query GetMilestones($owner: String!, $name: String!, $assignee: String!) {
title
assignees(first: 10) {
nodes {
avatarUrl
email
login
url
}
Expand All @@ -727,6 +779,12 @@ query GetMilestones($owner: String!, $name: String!, $assignee: String!) {
login
url
avatarUrl(size: 50)
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand Down Expand Up @@ -773,6 +831,8 @@ query Issues($query: String!) {
title
assignees(first: 10) {
nodes {
avatarUrl
email
login
url
}
Expand All @@ -781,6 +841,12 @@ query Issues($query: String!) {
login
url
avatarUrl(size: 50)
... on User {
email
}
... on Organization {
email
}
}
createdAt
updatedAt
Expand Down
21 changes: 16 additions & 5 deletions src/github/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'use strict';

import * as crypto from 'crypto';
import * as vscode from 'vscode';
import { Repository } from '../api/api';
import { GitApiImpl } from '../api/api1';
Expand Down Expand Up @@ -142,7 +143,7 @@ export function convertRESTUserToAccount(
return {
login: user.login,
url: user.html_url,
avatarUrl: githubRepository.isGitHubDotCom ? user.avatar_url : undefined,
avatarUrl: getAvatarWithEnterpriseFallback(user.avatar_url, user.gravatar_id, githubRepository.remote.authProviderId),
};
}

Expand Down Expand Up @@ -432,14 +433,15 @@ function parseRef(ref: GraphQL.Ref | undefined): IGitHubRef | undefined {
}

function parseAuthor(
author: { login: string; url: string; avatarUrl: string } | null,
author: { login: string; url: string; avatarUrl: string; email?: string } | null,
githubRepository: GitHubRepository,
): IAccount {
if (author) {
return {
login: author.login,
url: author.url,
avatarUrl: githubRepository.isGitHubDotCom ? author.avatarUrl : undefined,
avatarUrl: getAvatarWithEnterpriseFallback(author.avatarUrl, author.email, githubRepository.remote.authProviderId),
email: author.email
};
} else {
return {
Expand Down Expand Up @@ -501,7 +503,7 @@ export function parseGraphQLPullRequest(
suggestedReviewers: parseSuggestedReviewers(graphQLPullRequest.suggestedReviewers),
comments: parseComments(graphQLPullRequest.comments?.nodes, githubRepository),
milestone: parseMilestone(graphQLPullRequest.milestone),
assignees: graphQLPullRequest.assignees?.nodes,
assignees: graphQLPullRequest.assignees?.nodes.map(assignee => parseAuthor(assignee, githubRepository)),
};
}

Expand Down Expand Up @@ -537,7 +539,7 @@ export function parseGraphQLIssue(issue: GraphQL.PullRequest, githubRepository:
title: issue.title,
createdAt: issue.createdAt,
updatedAt: issue.updatedAt,
assignees: issue.assignees.nodes,
assignees: issue.assignees.nodes.map(assignee => parseAuthor(assignee, githubRepository)),
user: parseAuthor(issue.author, githubRepository),
labels: issue.labels.nodes,
repositoryName: issue.repository?.name,
Expand Down Expand Up @@ -938,3 +940,12 @@ export function hasEnterpriseUri(): boolean {
return !!getEnterpriseUri();
}

export function generateGravatarUrl(gravatarId: string, size: number = 200): string | undefined {
return !!gravatarId ? `https://www.gravatar.com/avatar/${gravatarId}?s=${size}&d=retro` : undefined;
}

export function getAvatarWithEnterpriseFallback(avatarUrl: string, email: string, authProviderId: AuthProvider): string | undefined {
return authProviderId === AuthProvider.github ? avatarUrl : generateGravatarUrl(
crypto.createHash('md5').update(email?.trim()?.toLowerCase()).digest('hex')
);
}
2 changes: 2 additions & 0 deletions src/test/builders/graphql/pullRequestBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ export const PullRequestBuilder = createBuilderClass<PullRequestResponse>()({
nodes: {
default: [
{
avatarUrl: undefined,
email: undefined,
login: 'me',
url: 'https://github.com/me',
},
Expand Down
4 changes: 4 additions & 0 deletions webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,9 @@ async function getWebviewConfig(mode, env, entry) {
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.svg'],
fallback: {
crypto: require.resolve("crypto-browserify"),
path: require.resolve('path-browserify'),
stream: require.resolve("stream-browserify"),
},
},
plugins: plugins,
Expand Down Expand Up @@ -305,7 +307,9 @@ async function getExtensionConfig(target, mode, env) {
fallback:
target === 'webworker'
? {
crypto: require.resolve("crypto-browserify"),
path: require.resolve('path-browserify'),
stream: require.resolve("stream-browserify"),
url: false,
}
: undefined,
Expand Down

0 comments on commit 694cb51

Please sign in to comment.