├── 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 | --------------------------------------------------------------------------------