├── LICENSE
├── README.md
└── git_data_fetcher.js
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Ashutosh Hathidara
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # github-graphql-api-tutorial
2 | The code in this repository is completely illustrated and explained in my youtube video given below
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/git_data_fetcher.js:
--------------------------------------------------------------------------------
1 | const openSource = {
2 | githubConvertedToken: "Your Github Token Here.",
3 | githubUserName: "Your Github Username Here.",
4 | };
5 |
6 | const fetch = require("node-fetch");
7 | var fs = require("fs");
8 |
9 | const query_pr = {
10 | query: `
11 | query {
12 | user(login: "${openSource.githubUserName}"){
13 | pullRequests(last: 100, orderBy: {field: CREATED_AT, direction: DESC}){
14 | totalCount
15 | nodes{
16 | id
17 | title
18 | url
19 | state
20 | mergedBy {
21 | avatarUrl
22 | url
23 | login
24 | }
25 | createdAt
26 | number
27 | changedFiles
28 | additions
29 | deletions
30 | baseRepository {
31 | name
32 | url
33 | owner {
34 | avatarUrl
35 | login
36 | url
37 | }
38 | }
39 | }
40 | }
41 | }
42 | }
43 | `,
44 | };
45 |
46 | const query_issue = {
47 | query: `query{
48 |
49 | user(login: "${openSource.githubUserName}") {
50 | issues(last: 100, orderBy: {field:CREATED_AT, direction: DESC}){
51 | totalCount
52 | nodes{
53 | id
54 | closed
55 | title
56 | createdAt
57 | url
58 | number
59 | assignees(first:100){
60 | nodes{
61 | avatarUrl
62 | name
63 | url
64 | }
65 | }
66 | repository{
67 | name
68 | url
69 | owner{
70 | login
71 | avatarUrl
72 | url
73 | }
74 | }
75 | }
76 | }
77 | }
78 |
79 | }`,
80 | };
81 |
82 | const query_org = {
83 | query: `query{
84 | user(login: "${openSource.githubUserName}") {
85 | repositoriesContributedTo(last: 100){
86 | totalCount
87 | nodes{
88 | owner{
89 | login
90 | avatarUrl
91 | __typename
92 | }
93 | }
94 | }
95 | }
96 | }`,
97 | };
98 |
99 | const query_pinned_projects = {
100 | query: `
101 | query {
102 | user(login: "${openSource.githubUserName}") {
103 | pinnedItems(first: 6, types: REPOSITORY) {
104 | totalCount
105 | nodes{
106 | ... on Repository{
107 | id
108 | name
109 | createdAt,
110 | url,
111 | description,
112 | isFork,
113 | languages(first:10){
114 | nodes{
115 | name
116 | }
117 | }
118 | }
119 | }
120 | }
121 | }
122 | }
123 | `,
124 | };
125 |
126 | const baseUrl = "https://api.github.com/graphql";
127 |
128 | const headers = {
129 | "Content-Type": "application/json",
130 | Authorization: "bearer " + openSource.githubConvertedToken,
131 | };
132 |
133 | fetch(baseUrl, {
134 | method: "POST",
135 | headers: headers,
136 | body: JSON.stringify(query_pr),
137 | })
138 | .then((response) => response.text())
139 | .then((txt) => {
140 | const data = JSON.parse(txt);
141 | var cropped = { data: [] };
142 | cropped["data"] = data["data"]["user"]["pullRequests"]["nodes"];
143 |
144 | var open = 0;
145 | var closed = 0;
146 | var merged = 0;
147 | for (var i = 0; i < cropped["data"].length; i++) {
148 | if (cropped["data"][i]["state"] === "OPEN") open++;
149 | else if (cropped["data"][i]["state"] === "MERGED") merged++;
150 | else closed++;
151 | }
152 |
153 | cropped["open"] = open;
154 | cropped["closed"] = closed;
155 | cropped["merged"] = merged;
156 | cropped["totalCount"] = cropped["data"].length;
157 |
158 | console.log("Fetching the Pull Request Data.\n");
159 | fs.writeFile(
160 | "./src/shared/opensource/pull_requests.json",
161 | JSON.stringify(cropped),
162 | function (err) {
163 | if (err) {
164 | console.log(err);
165 | }
166 | }
167 | );
168 | })
169 | .catch((error) => console.log(JSON.stringify(error)));
170 |
171 | fetch(baseUrl, {
172 | method: "POST",
173 | headers: headers,
174 | body: JSON.stringify(query_issue),
175 | })
176 | .then((response) => response.text())
177 | .then((txt) => {
178 | const data = JSON.parse(txt);
179 | var cropped = { data: [] };
180 | cropped["data"] = data["data"]["user"]["issues"]["nodes"];
181 |
182 | var open = 0;
183 | var closed = 0;
184 | for (var i = 0; i < cropped["data"].length; i++) {
185 | if (cropped["data"][i]["closed"] === false) open++;
186 | else closed++;
187 | }
188 |
189 | cropped["open"] = open;
190 | cropped["closed"] = closed;
191 | cropped["totalCount"] = cropped["data"].length;
192 |
193 | console.log("Fetching the Issues Data.\n");
194 | fs.writeFile(
195 | "./src/shared/opensource/issues.json",
196 | JSON.stringify(cropped),
197 | function (err) {
198 | if (err) {
199 | console.log(err);
200 | }
201 | }
202 | );
203 | })
204 | .catch((error) => console.log(JSON.stringify(error)));
205 |
206 | fetch(baseUrl, {
207 | method: "POST",
208 | headers: headers,
209 | body: JSON.stringify(query_org),
210 | })
211 | .then((response) => response.text())
212 | .then((txt) => {
213 | const data = JSON.parse(txt);
214 | const orgs = data["data"]["user"]["repositoriesContributedTo"]["nodes"];
215 | var newOrgs = { data: [] };
216 | for (var i = 0; i < orgs.length; i++) {
217 | var obj = orgs[i]["owner"];
218 | if (obj["__typename"] === "Organization") {
219 | var flag = 0;
220 | for (var j = 0; j < newOrgs["data"].length; j++) {
221 | if (JSON.stringify(obj) === JSON.stringify(newOrgs["data"][j])) {
222 | flag = 1;
223 | break;
224 | }
225 | }
226 | if (flag === 0) {
227 | newOrgs["data"].push(obj);
228 | }
229 | }
230 | }
231 |
232 | console.log("Fetching the Contributed Organization Data.\n");
233 | fs.writeFile(
234 | "./src/shared/opensource/organizations.json",
235 | JSON.stringify(newOrgs),
236 | function (err) {
237 | if (err) {
238 | console.log(err);
239 | }
240 | }
241 | );
242 | })
243 | .catch((error) => console.log(JSON.stringify(error)));
244 |
245 | const languages_icons = {
246 | Python: "logos-python",
247 | "Jupyter Notebook": "logos-jupyter",
248 | HTML: "logos-html-5",
249 | CSS: "logos-css-3",
250 | JavaScript: "logos-javascript",
251 | "C#": "logos-c-sharp",
252 | Java: "logos-java",
253 | };
254 |
255 | fetch(baseUrl, {
256 | method: "POST",
257 | headers: headers,
258 | body: JSON.stringify(query_pinned_projects),
259 | })
260 | .then((response) => response.text())
261 | .then((txt) => {
262 | const data = JSON.parse(txt);
263 | // console.log(txt);
264 | const projects = data["data"]["user"]["pinnedItems"]["nodes"];
265 | var newProjects = { data: [] };
266 | for (var i = 0; i < projects.length; i++) {
267 | var obj = projects[i];
268 | var langobjs = obj["languages"]["nodes"];
269 | var newLangobjs = [];
270 | for (var j = 0; j < langobjs.length; j++) {
271 | if (langobjs[j]["name"] in languages_icons) {
272 | newLangobjs.push({
273 | name: langobjs[j]["name"],
274 | iconifyClass: languages_icons[langobjs[j]["name"]],
275 | });
276 | }
277 | }
278 | obj["languages"] = newLangobjs;
279 | newProjects["data"].push(obj);
280 | }
281 |
282 | console.log("Fetching the Pinned Projects Data.\n");
283 | fs.writeFile(
284 | "./src/shared/opensource/projects.json",
285 | JSON.stringify(newProjects),
286 | function (err) {
287 | if (err) {
288 | console.log(
289 | "Error occured in pinned projects 1",
290 | JSON.stringify(err)
291 | );
292 | }
293 | }
294 | );
295 | })
296 | .catch((error) =>
297 | console.log("Error occured in pinned projects 2", JSON.stringify(error))
298 | );
299 |
--------------------------------------------------------------------------------