From e3bf5c077a73f57a215af24dfe78ecaa25092029 Mon Sep 17 00:00:00 2001 From: vn7n24fzkq Date: Sun, 16 Aug 2020 15:27:04 +0800 Subject: [PATCH] Add a simple github api request --- package.json | 5 +- src/utils/github-api/langs.js | 87 +++++++++++++++++++++++++++++++++++ src/utils/request.js | 12 +++++ 3 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/utils/github-api/langs.js create mode 100644 src/utils/request.js diff --git a/package.json b/package.json index aed4893d0..3605cc5c2 100644 --- a/package.json +++ b/package.json @@ -10,5 +10,8 @@ "github" ], "author": "vn7 ", - "license": "MIT" + "license": "MIT", + "dependencies": { + "axios": "^0.19.2" + } } diff --git a/src/utils/github-api/langs.js b/src/utils/github-api/langs.js new file mode 100644 index 000000000..cf4527637 --- /dev/null +++ b/src/utils/github-api/langs.js @@ -0,0 +1,87 @@ +const request = require("../../utils/request"); + +const fetcher = (token, variables) => { + //contain private repo need token permission + return request( + { + Authorization: `bearer ${token}`, + }, + { + query: ` + query userInfo($login: String!,$endCursor: String) { + user(login: $login) { + repositories(isFork: false, first: 100, after: $endCursor,ownerAffiliations: OWNER) { + nodes { + languages(first: 10, orderBy: {field: SIZE, direction: DESC}) { + edges { + size + node { + color + name + } + } + } + } + pageInfo{ + endCursor + hasNextPage + } + } + } + } + `, + variables, + } + ); +}; + +//repos per language +async function getRepoLanguage(username,token) { + let hasNextPage = true; + let cursor = null; + let languageMap = new Map(); + let nodes=[]; + + + try { + while (hasNextPage) { + let res = await fetcher(token, { + login: username, + endCursor: cursor, + }); + + if (res.data.errors) { + throw Error(res.data.errors[0].message || "Could not fetch user"); + } + cursor = res.data.data.user.repositories.pageInfo.endCursor; + hasNextPage = res.data.data.user.repositories.pageInfo.hasNextPage; + nodes.push(...res.data.data.user.repositories.nodes); + } + + nodes.forEach(node=>{ + node.languages.edges.forEach(edge=>{ + let langName = edge.node.name; + console.log(languageMap.has(langName)); + if(languageMap.has(langName)){ + let lang = languageMap.get(langName); + lang.count+=1; + languageMap.set(langName, lang); + }else{ + languageMap.set(langName, {count:1,color:edge.node.color}); + } + }); + }); + + } catch (e) { + console.log("error"); + if(e.response){ + console.log(e.response.data); + }else{ + console.log(e); + } + } + + return languageMap; +} + +module.exports = getRepoLanguage; diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 000000000..8a3a6dcfe --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,12 @@ +const axios = require("axios"); + +function request(header,data) { + return axios({ + url: "https://api.github.com/graphql", + method: "post", + headers: header, + data: data, + }); +} + +module.exports = request;