const { request } = require("./utils"); const calculateRank = require("./calculateRank"); require("dotenv").config(); async function fetchStats(username) { if (!username) throw Error("Invalid username"); const res = await request({ query: ` query userInfo($login: String!) { user(login: $login) { name login repositoriesContributedTo(first: 100, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) { totalCount } contributionsCollection { totalCommitContributions } pullRequests(first: 100) { totalCount } issues(first: 100) { totalCount } followers { totalCount } repositories(first: 100, orderBy: { direction: DESC, field: STARGAZERS }) { totalCount nodes { stargazers { totalCount } } } } } `, variables: { login: username }, }); const stats = { name: "", totalPRs: 0, totalCommits: 0, totalIssues: 0, totalStars: 0, contributedTo: 0, rank: "C", }; if (res.data.errors) { console.log(res.data.errors); throw Error("Could not fetch user"); } const user = res.data.data.user; stats.name = user.name || user.login; stats.totalIssues = user.issues.totalCount; stats.totalCommits = user.contributionsCollection.totalCommitContributions; stats.totalPRs = user.pullRequests.totalCount; stats.contributedTo = user.repositoriesContributedTo.totalCount; stats.totalStars = user.repositories.nodes.reduce((prev, curr) => { return prev + curr.stargazers.totalCount; }, 0); stats.rank = calculateRank({ totalCommits: stats.totalCommits, totalRepos: user.repositories.totalCount, followers: user.followers.totalCount, contributions: stats.contributedTo, stargazers: stats.totalStars, prs: stats.totalPRs, issues: stats.totalIssues, }); return stats; } module.exports = fetchStats;