diff options
Diffstat (limited to 'routes/repositories.js')
| -rw-r--r-- | routes/repositories.js | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/routes/repositories.js b/routes/repositories.js new file mode 100644 index 0000000..7ab6164 --- /dev/null +++ b/routes/repositories.js @@ -0,0 +1,290 @@ +const express = require("express"); +const router = express.Router(); +const { Github } = require("../api/github"); +const github = new Github("luciferreeves"); +const fs = require("fs"); +const cheerio = require("cheerio"); + +router.get("/repos", (req, res) => { + const page = req.query.page || 1; + github.getRepos(page).then((repos) => { + github.getRepos(parseInt(page) + 1).then((repos2) => { + const count = repos.length; + const count2 = repos2.length; + const repositories = []; + repos.forEach((repo) => { + repositories.push({ + name: repo.name, + description: repo.description, + url: repo.html_url, + language: repo.language, + stars: repo.stargazers_count, + forks: repo.forks_count, + issues: repo.open_issues_count, + license: repo.license ? repo.license.name : null, + updated: repo.updated_at, + created: repo.created_at, + }); + }); + const reposData = { + count: count, + countNext: count2, + repositories: repositories, + }; + github.getUserDetails().then((user) => { + github.getOneYearUserContributions().then((contributions) => { + const data = { + user: { + login: user.login, + name: user.name, + avatar: user.avatar_url, + location: user.location, + bio: user.bio, + url: user.html_url, + followers: user.followers, + following: user.following, + company: user.company, + twitter: user.twitter_username, + blog: user.blog, + }, + contributions: contributions, + }; + var html = fs.readFileSync( + __dirname + "/../public/views/repositories.html", + "utf8" + ); + var $ = cheerio.load(html); + const userScript = ` + <script> + const userData = document.getElementById("userData"); + const userAvatar = document.createElement("img"); + userAvatar.src = "${data.user.avatar}"; + userAvatar.className = "img-polaroid"; + userAvatar.style.width = "100%"; + userData.appendChild(userAvatar); + const strong = document.createElement("strong"); + const userName = document.createElement("h2"); + userName.innerHTML = "${data.user.name}"; + userName.style.color = "#000"; + strong.appendChild(userName); + userData.appendChild(strong); + const userBio = document.createElement("p"); + userBio.innerHTML = "${data.user.bio}"; + userBio.style.color = "#000"; + userData.appendChild(userBio); + const followerContainer = document.createElement("p"); + followerContainer.style.color = "#000"; + const followerIcon = document.createElement("i"); + followerIcon.classList.add("tcs-icon", "trophy", "is-small"); + followerContainer.appendChild(followerIcon); + const followerText = document.createElement("span"); + followerText.innerHTML = " " + "${data.user.followers}" + " Followers"; + followerContainer.appendChild(followerText); + userData.appendChild(followerContainer); + const twParagraph = document.createElement("p"); + twParagraph.style.color = "#000"; + const twitterIcon = document.createElement("i"); + twitterIcon.classList.add("tcs-icon", "twitter", "is-small"); + twParagraph.appendChild(twitterIcon); + const twitterText = document.createElement("span"); + const ts2 = document.createElement("span"); + ts2.innerHTML = " "; + twitterText.appendChild(ts2); + const twitterContainer = document.createElement("a"); + twitterContainer.style.color = "#db4437"; + twitterContainer.classList.add("a-hvr"); + twitterContainer.href = "https://twitter.com/" + "${data.user.twitter}"; + twitterContainer.target = "_blank"; + twitterContainer.innerHTML = "${data.user.twitter}"; + twitterText.appendChild(twitterContainer); + twParagraph.appendChild(twitterText); + userData.appendChild(twParagraph); + const ghParagraph = document.createElement("p"); + ghParagraph.style.color = "#000"; + const githubIcon = document.createElement("i"); + githubIcon.classList.add("tcs-icon", "github", "is-small"); + ghParagraph.appendChild(githubIcon); + const githubText = document.createElement("span"); + const ts3 = document.createElement("span"); + ts3.innerHTML = " "; + githubText.appendChild(ts3); + const githubContainer = document.createElement("a"); + githubContainer.style.color = "#db4437"; + githubContainer.classList.add("a-hvr"); + githubContainer.href = "${data.user.url}"; + githubContainer.target = "_blank"; + githubContainer.innerHTML = "${data.user.login}"; + githubText.appendChild(githubContainer); + ghParagraph.appendChild(githubText); + userData.appendChild(ghParagraph); + const weeklyContributionsTitle = "Weekly Contributions (Past Year)"; + const weeklyContributions = document.createElement("p"); + weeklyContributions.style.color = "#000"; + weeklyContributions.innerHTML = weeklyContributionsTitle; + weeklyContributions.style.textAlign = "center"; + userData.appendChild(weeklyContributions); + const contributions = [${data.contributions}]; + const canvas = document.createElement("canvas"); + canvas.id = "contributionsChart"; + const ctx = canvas.getContext("2d"); + const color = "#000083"; + // Generate Dates of past 53 weeks + const dates = []; + const today = new Date(); + const startDate = new Date( + today.getFullYear(), + today.getMonth(), + today.getDate() - 53 * 7 + ); + for (let i = 0; i < 53; i++) { + const date = new Date( + startDate.getFullYear(), + startDate.getMonth(), + startDate.getDate() + i * 7 + ); + const datePlusSevenDays = new Date( + date.getFullYear(), + date.getMonth(), + date.getDate() + 6 + ); + const sd = date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }); + const ed = datePlusSevenDays.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }); + dates.push(sd + " - " + ed); + } + const contributionsChart = new Chart(ctx, { + type: "bar", + data: { + labels: dates, + datasets: [ + { + label: "Weekly Contributions", + data: contributions, + backgroundColor: color, + }, + ], + }, + options: { + plugins: { + legend: { + display: false, + }, + }, + scales: { + x: { + ticks: { + display: false, + }, + }, + y: { + ticks: { + display: false, + beginAtZero: true, + }, + }, + }, + }, + }); + canvas.height = "200px"; + userData.appendChild(canvas); + </script> + `; + const repoScript = ` + <script> + const repos = document.getElementById("repos"); + const page = window.location.search.split("page=")[1] || 1; + + function nextPage() { + window.location.href = "?page=${parseInt(page) + 1}"; + } + + function prevPage() { + window.location.href = "?page=${parseInt(page) - 1}"; + } + if (page == 1) { + document.getElementById("olderTop").classList.add("disabled"); + document.getElementById("olderBottom").classList.add("disabled"); + } else { + document.getElementById("olderTop").classList.remove("disabled"); + document.getElementById("olderBottom").classList.remove("disabled"); + document.getElementById("olderTop").addEventListener("click", prevPage); + document.getElementById("olderBottom").addEventListener("click", prevPage); + } + if (${reposData.countNext} == 0) { + document.getElementById("newerTop").classList.add("disabled"); + document.getElementById("newerBottom").classList.add("disabled"); + } else { + document.getElementById("newerTop").classList.remove("disabled"); + document.getElementById("newerBottom").classList.remove("disabled"); + document.getElementById("newerTop").addEventListener("click", nextPage); + document.getElementById("newerBottom").addEventListener("click", nextPage); + } + const repositories = ${JSON.stringify(reposData.repositories)}; + repositories.forEach((repo) => { + const leadParagraphCotainer = document.createElement("p"); + leadParagraphCotainer.className = "lead"; + const repoName = repo.name; + const repoLink = repo.url; + const repoDescription = repo.description; + const repoLanguage = repo.language || "No language"; + const repoStars = repo.stars; + const repoForks = repo.forks; + const license = repo.license; + + const nameContainer = document.createElement("h3"); + nameContainer.innerHTML = repoName; + const descriptionContainer = document.createElement("p"); + descriptionContainer.innerHTML = repoDescription; + const languageAndLicenseContainer = document.createElement("div"); + const languageBadgeContainer = document.createElement("span"); + languageBadgeContainer.className = "badge badge-warning"; + languageBadgeContainer.innerHTML = repoLanguage; + const licenseBadgeContainer = document.createElement("span"); + licenseBadgeContainer.className = "badge badge-info"; + licenseBadgeContainer.style.marginLeft = "10px"; + licenseBadgeContainer.innerHTML = license; + languageAndLicenseContainer.appendChild(languageBadgeContainer); + languageAndLicenseContainer.appendChild(licenseBadgeContainer); + languageAndLicenseContainer.style.marginBottom = "10px"; + const starsAndForksContainer = document.createElement("div"); + const starsContainer = document.createElement("span"); + const starIcon = document.createElement("i"); + starIcon.classList.add("tcs-icon", "star", "is-small"); + starsContainer.appendChild(starIcon); + starsContainer.innerHTML += " " + repoStars + " Stars"; + const forksContainer = document.createElement("span"); + forksContainer.innerHTML += " " + repoForks + " Forks"; + starsAndForksContainer.appendChild(starsContainer); + starsAndForksContainer.appendChild(forksContainer); + starsAndForksContainer.style.marginBottom = "10px"; + const repoLinkContainer = document.createElement("p"); + const repoLinkAnchor = document.createElement("a"); + repoLinkAnchor.href = repoLink; + repoLinkAnchor.innerHTML = "View on Github"; + repoLinkContainer.appendChild(repoLinkAnchor); + leadParagraphCotainer.appendChild(nameContainer); + leadParagraphCotainer.appendChild(descriptionContainer); + leadParagraphCotainer.appendChild(languageAndLicenseContainer); + leadParagraphCotainer.appendChild(starsAndForksContainer); + leadParagraphCotainer.appendChild(repoLinkContainer); + repos.appendChild(leadParagraphCotainer); + }); + </script> + `; + $("body").append(userScript); + $("body").append(repoScript); + res.send($.html()); + }); + }); + }); + }); +}); + +module.exports = router; |
