refactor server

This commit is contained in:
hazycora 2023-08-03 06:52:39 -05:00
parent 5ed3fda233
commit a8ef583dea
No known key found for this signature in database
GPG key ID: 215AF1F81F86940E

155
server.js
View file

@ -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, () => {