const axios = require("axios");
require("dotenv").config();
async function fetchStats(username) {
const res = await axios({
url: "https://api.github.com/graphql",
method: "post",
headers: {
Authorization: `bearer ${process.env.GITHUB_TOKEN}`,
},
data: {
query: `
query userInfo($login: String!) {
user(login: $login) {
name
repositoriesContributedTo(first: 100, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) {
totalCount
}
pullRequests(first: 100) {
totalCount
}
issues(first: 100) {
totalCount
}
repositories(first: 100) {
nodes {
stargazers {
totalCount
}
}
}
}
}
`,
variables: {
login: username,
},
},
});
const stats = {
name: "",
totalPRs: 0,
totalIssues: 0,
totalStars: 0,
contributedTo: 0,
};
if (res.data.error) return stats;
const user = res.data.data.user;
stats.name = user.name;
stats.totalIssues = user.issues.totalCount;
stats.totalPRs = user.pullRequests.totalCount;
stats.contributedTo = user.repositoriesContributedTo.totalCount;
stats.totalStars = user.repositories.nodes.reduce((prev, curr) => {
return prev + curr.stargazers.totalCount;
}, 0);
return stats;
}
const renderSVG = (stats, options) => {
const { name, totalStars, totalIssues, totalPRs, contributedTo } = stats;
const { hide } = options || {};
const height = 150 - hide.length * 20;
const STAT_MAP = {
stars: `
Total Stars:
${totalStars}
`,
prs: `
Total PRs:
${totalPRs}
`,
issues: `
Total Issues:
${totalIssues}
`,
contribs: `
Contributed to:
${contributedTo} repos
`,
};
return `
`;
};
module.exports = async (req, res) => {
const username = req.query.username;
const hide = req.query.hide;
let {
name,
totalPRs,
totalStars,
totalIssues,
contributedTo,
} = await fetchStats(username);
res.setHeader("Content-Type", "image/svg+xml");
res.send(
renderSVG(
{
name,
totalStars,
totalIssues,
totalPRs,
contributedTo,
},
{ hide: JSON.parse(hide || "[]") }
)
);
};