From a8ef583deae8566d08d4540fed17e3901d53fe0a Mon Sep 17 00:00:00 2001 From: hazycora Date: Thu, 3 Aug 2023 06:52:39 -0500 Subject: [PATCH] refactor server --- server.js | 155 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 46 deletions(-) diff --git a/server.js b/server.js index 014760a..2a62ca5 100644 --- a/server.js +++ b/server.js @@ -36,29 +36,40 @@ function getLanguagePercentages(languages) { ) } -app.get('/:owner/:repo', async function (req, res) { - const repoResp = await fetch( +async function getLanguages(owner, repo) { + const languagesResp = await fetch( `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}` + owner + )}/${encodeURIComponent(repo)}/languages` ) + if (languagesResp.ok) { + return getLanguagePercentages(await languagesResp.json()) + } + return {} +} + +app.get('/:owner/:repo', async function (req, res) { + const [repoResp, commitsResp, languages] = await Promise.all([ + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}` + ), + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/commits?limit=1` + ), + getLanguages(req.params.owner, req.params.repo) + ]) if (!repoResp.ok) { res.status(repoResp.status) res.end() return } const repo = await repoResp.json() - let languages = {} - if (!repo.empty && repo.languages_url) { - const languagesResp = await fetch( - `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}/languages` - ) - if (languagesResp.ok) { - languages = getLanguagePercentages(await languagesResp.json()) - } - } + repo.commits_count = + Number.parseInt(commitsResp.headers.get('x-total-count')) || 0 const html = await eta.renderAsync('repo', { repo, languages, @@ -75,28 +86,22 @@ app.get('/:owner/:repo', async function (req, res) { }) app.get('/:owner/:repo/commit/:hash', async function (req, res) { - const commitResp = await fetch( - `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}/git/commits/${encodeURIComponent( - req.params.hash - )}` - ) + const [commitResp, languages] = await Promise.all([ + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent( + req.params.repo + )}/git/commits/${encodeURIComponent(req.params.hash)}` + ), + getLanguages(req.params.owner, req.params.repo) + ]) if (!commitResp.ok) { res.status(commitResp.status) res.end() return } const commit = await commitResp.json() - let languages = {} - const languagesResp = await fetch( - `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}/languages` - ) - if (languagesResp.ok) { - languages = getLanguagePercentages(await languagesResp.json()) - } const html = await eta.renderAsync('commit', { commit: { ...commit.commit, @@ -121,28 +126,35 @@ app.get('/:owner/:repo/commit/:hash', async function (req, res) { res.send(await render(html)) }) -app.get('/:owner/:repo/issue/:num', async function (req, res) { - const issueResp = await fetch( - `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}/issues/${encodeURIComponent( - req.params.num - )}` +app.get('/:owner/:repo/:type/:num', (req, res, next) => { + if (req.params.type != 'pull' && req.params.type != 'issue') return next() + res.redirect( + `/${req.params.owner}/${req.params.repo}/${req.params.type}s/${req.params.num}` ) +}) + +app.get('/:owner/:repo/issues/:num', async function (req, res) { + const [issueResp, languages] = await Promise.all([ + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/issues/${encodeURIComponent( + req.params.num + )}` + ), + getLanguages(req.params.owner, req.params.repo) + ]) if (!issueResp.ok) { res.status(issueResp.status) res.end() return } const issue = await issueResp.json() - let languages = {} - const languagesResp = await fetch( - `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( - req.params.owner - )}/${encodeURIComponent(req.params.repo)}/languages` - ) - if (languagesResp.ok) { - languages = getLanguagePercentages(await languagesResp.json()) + if (issue.pull_request) { + res.redirect( + `/${req.params.owner}/${req.params.repo}/pulls/${req.params.num}` + ) + return } const html = await eta.renderAsync('issue', { issue, @@ -159,6 +171,57 @@ app.get('/:owner/:repo/issue/:num', async function (req, res) { res.send(await render(html)) }) +app.get('/:owner/:repo/pulls/:num', async function (req, res) { + const [pullResp, pullCommitsResp, languages] = await Promise.all([ + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/pulls/${encodeURIComponent( + req.params.num + )}` + ), + fetch( + `${forgejoBaseUrl}/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/pulls/${encodeURIComponent( + req.params.num + )}/commits?limit=0` + ), + getLanguages(req.params.owner, req.params.repo) + ]) + if (!pullResp.ok || !pullCommitsResp.ok) { + res.status(pullResp.status) + res.end() + return + } + const [pull, commits] = await Promise.all([ + pullResp.json(), + pullCommitsResp.json() + ]) + pull.commits_count = + Number.parseInt(pullCommitsResp.headers.get('x-total-count')) || 0 + const stats = { total: 0, additions: 0, deletions: 0 } + for (const commit of commits) { + stats.total += commit.stats.total + stats.additions += commit.stats.additions + stats.deletions += commit.stats.deletions + } + const html = await eta.renderAsync('issue', { + issue: pull, + prStats: stats, + languages, + languageColors, + debug + }) + if (debug) { + res.send(await renderHtml(html)) + return + } + res.type('png') + res.set('Content-Disposition', 'inline') + res.send(await render(html)) +}) + const [port, host] = [process.env.PORT ?? 9054, process.env.HOST ?? '127.0.0.1'] app.listen(port, host, () => {