From 5f41aff0ae66dd9709ed019b2890a077da0494de Mon Sep 17 00:00:00 2001 From: Jeroen Ooms Date: Sun, 5 Jan 2025 21:34:31 +0100 Subject: [PATCH] Only link to existing universes --- routes/cache.js | 2 +- routes/pkginfo.js | 17 ++++++++++++----- src/db.js | 10 ++++++++++ views/pkginfo.pug | 6 +++--- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/routes/cache.js b/routes/cache.js index a3d4a13..99b4600 100644 --- a/routes/cache.js +++ b/routes/cache.js @@ -34,7 +34,7 @@ export default function(req, res, next){ res.set('Cache-Control', `public, max-age=60, stale-while-revalidate=${cdn_cache}`); if(doc){ - const revision = 2; // bump to invalidate all caches + const revision = 3; // bump to invalidate all caches const etag = `W/"${doc._id}${revision}"`; const date = new Date(doc._published.getTime() + revision * 1000).toUTCString(); res.set('ETag', etag); diff --git a/routes/pkginfo.js b/routes/pkginfo.js index 541384a..58e63a2 100644 --- a/routes/pkginfo.js +++ b/routes/pkginfo.js @@ -1,7 +1,7 @@ import express from 'express'; import createError from 'http-errors'; import url from 'node:url'; -import {get_package_info} from '../src/db.js'; +import {get_package_info, get_all_universes} from '../src/db.js'; const router = express.Router(); function avatar_url(login, size){ @@ -133,9 +133,15 @@ function filter_releases(pkgdata){ } } -function filter_contributions(pkgdata, max = 12){ +function filter_contributions(pkgdata, universes, max = 12){ if(pkgdata._contributions){ - return Object.fromEntries(Object.entries(pkgdata._contributions).slice(0,max)) + return Object.entries(pkgdata._contributions).slice(0,max).map(function([login, count]){ + return { + login: login, + count: count, + href: universes.includes(login) && `https://${login}.r-universe.dev/contributors` + } + }); } } @@ -220,7 +226,8 @@ function description_to_html(txt = ""){ } router.get('/:package', function(req, res, next) { - return get_package_info(req.params.package, req.universe).then(function(pkgdata){ + const promises = [get_package_info(req.params.package, req.universe), get_all_universes()]; + return Promise.all(promises).then(function([pkgdata, universes]){ pkgdata.url = url; pkgdata.format_count = format_count; pkgdata.universe = pkgdata._user; @@ -237,7 +244,7 @@ router.get('/:package', function(req, res, next) { pkgdata._problems = problem_summary(pkgdata); pkgdata._lastupdate = pretty_time_diff(pkgdata._commit.time); pkgdata._releases = filter_releases(pkgdata); - pkgdata._contributions = filter_contributions(pkgdata); + pkgdata._contributions = filter_contributions(pkgdata, universes); pkgdata._universe_type = pkgdata._userbio.type; pkgdata._universe_name = pkgdata._userbio.name; pkgdata._universe_bio = pkgdata._userbio.description; diff --git a/src/db.js b/src/db.js index 80320e5..39df984 100644 --- a/src/db.js +++ b/src/db.js @@ -18,6 +18,7 @@ const db = production && client.db('cranlike'); const bucket = production && new GridFSBucket(db, {bucketName: 'files'}); const packages = production && db.collection('packages'); const chunks = production && db.collection('files.chunks'); +const universes = production && packages.distinct('_universes'); console.log("Connected to MongoDB!"); function mongo_latest(q){ @@ -602,3 +603,12 @@ export function bucket_find(query, options = {}){ throw "Not implemented for devel"; } } + +//use cached result because we dont want any delay for this +export function get_all_universes(){ + if(production){ + return universes; + } else { + throw "Not implemented for devel"; + } +} diff --git a/views/pkginfo.pug b/views/pkginfo.pug index a344ebd..78aae24 100644 --- a/views/pkginfo.pug +++ b/views/pkginfo.pug @@ -336,9 +336,9 @@ block content canvas#package-updates-canvas(height='300') if _contributions .package-details-contributors.text-center - each count, login in _contributions - a.me-1.package-details-contributor.text-decoration-none(href=`https://${login}.r-universe.dev/contributors`) - img.package-contributor-img.img-fluid.p-1.shadow-lg(loading="lazy" data-count=count data-login=login style='width: 80px; border-radius: 50%;' src=avatar_url(login, 160)) + each x in _contributions + a.me-1.package-details-contributor.text-decoration-none(href=x.href) + img.package-contributor-img.img-fluid.p-1.shadow-lg(loading="lazy" data-count=x.count data-login=x.login style='width: 80px; border-radius: 50%;' src=avatar_url(x.login, 160)) #readme.package-details-readme.row.card.mt-4(data-scroll-to="tooltip" data-position="left" data-title='Documentation' data-intro='Rendered documentation from the README and help pages.') a.plink.card-title.card-header.text-center.text-dark(href='#readme')