Changeset 72ec6a4 in Klonkt for src/routes/posts.js


Ignore:
Timestamp:
07/31/2026 06:55:59 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
17546af
Parents:
bfa6fa1
Message:

Hub-modus en guardian-lite eruit

Robins besluit (31-7): een instance is een eigenaar. Twee dingen weg.

HUB-MODUS was al dood: getTenancy() gaf sinds 24-6 hardcoded 'solo'
terug, dus elke tenancy === 'hub'-tak was onbereikbaar. Nu ook echt
verwijderd: getTenancy/setTenancy zelf, de /user/:slug-routing in
resolveSite, de hub-takken in admin, zoeken, audio, posts (neighbours
en related over alle sites), download, en de push-prefix. In de views
verdwijnen de hub-tagline, de hub-navigatie, de sites- en
users-tabellen (die kwamen alleen in hub-modus gevuld en verwezen nu
naar locals die niemand meer meegeeft), de eigenaar-toewijzing bij een
site, de /user/-slugprefix, het hub-brandblok en de hub-thuisknop.

GUARDIAN-LITE was de laatste multi-user-rest: /guardian/invite gaf een
link waarmee iemand via /guardian/join een echte user plus een site met
guardian_only=1 aanmaakte. Dat zette andermans wachtwoordhash, sessie
en PRIVATE actor-sleutel in jouw database, waardoor een verhuizing of
export nooit netjes kon (shaer-qw6q). Routes, formulier, kolom en
uitnodigingstabel zijn weg. Het guardian-DASHBOARD blijft: dat is
FEP-633c en werkt voor guardians met een eigen Klonkt. Bestaande
installaties houden kolom en tabel ongebruikt; nieuwe krijgen ze niet.

Changed files:
src/services/SettingsService.js

  • getTenancy/setTenancy verwijderd; kop herschreven

src/middleware/site.js, src/middleware/render.js

  • /user/:slug-routing weg; tenancy en hubTitle uit de locals

src/routes/admin.js, admin-settings.js, audio.js, download.js,
src/routes/posts.js, search.js

  • hub-takken en hub-queries weg; postNeighbors zonder isHub

src/services/ActivityPubService.js

  • pushPrefix is nu gewoon ; getTenancy-import weg

src/routes/guardian.js

  • /invite en /join verwijderd (dashboard blijft), imports opgeschoond

src/config/database.js

  • guardian_only-kolom en ap_guardian_invites-tabel niet meer aangemaakt

src/views/pages/admin.ejs, admin-users.ejs, admin-site-edit.ejs,
src/views/pages/guardian.ejs, partials/topnav.ejs, chrome.ejs, bottom-tab.ejs

  • alle hub-takken en de uitnodigingsknop weg

remarks: 320 regels weg, 63 erbij. Suite 372 groen; alle 85 templates
compileren; en met een wegwerp-kopie van de database daadwerkelijk
gedraaid en ingelogd: /, /admin, /admin/users, /admin/sites,
/admin/settings, /admin/sites/demo/edit, /admin/media en /guardian
geven alle 200 zonder fouten in het log, en /guardian/invite en
/guardian/join geven nu 404.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/posts.js

    rbfa6fa1 r72ec6a4  
    763763}
    764764
    765 function postNeighbors(site, post, isHub) {
    766   const urlBaseFor = (p) => (isHub && p && p.site_slug) ? `/user/${p.site_slug}` : '';
    767   const ordered = isHub
    768     ? db.prepare(`
    769         SELECT p.id, p.slug, p.title, p.pinned, s.slug AS site_slug
    770         FROM posts p JOIN sites s ON s.id = p.site_id
    771         WHERE p.status = 'published'
    772         ORDER BY p.published_at DESC
    773       `).all()
    774     : db.prepare(`
    775         SELECT id, slug, title, pinned FROM posts
    776         WHERE site_id = ? AND status = 'published'
    777         ORDER BY (pinned = 0) ASC, pinned ASC, published_at DESC
    778       `).all(site.id);
     765function postNeighbors(site, post) {
     766  const ordered = db.prepare(`
     767    SELECT id, slug, title, pinned FROM posts
     768    WHERE site_id = ? AND status = 'published'
     769    ORDER BY (pinned = 0) ASC, pinned ASC, published_at DESC
     770  `).all(site.id);
    779771  const idx = ordered.findIndex((p) => p.id === post.id);
    780772  const newerPost = idx > 0 ? ordered[idx - 1] : null;
    781773  const olderPost = (idx >= 0 && idx < ordered.length - 1) ? ordered[idx + 1] : null;
    782   if (newerPost) newerPost._urlBase = urlBaseFor(newerPost);
    783   if (olderPost) olderPost._urlBase = urlBaseFor(olderPost);
     774  if (newerPost) newerPost._urlBase = '';
     775  if (olderPost) olderPost._urlBase = '';
    784776  return { newerPost, olderPost };
    785777}
     
    13441336  const _unlocked = _u && _u.purpose === 'unlocked' && _u.siteId === site.id && String(_u.post) === String(post.slug);
    13451337  if (post.paid && !canEditThis && !_unlocked) {
    1346     const { newerPost, olderPost } = postNeighbors(site, post, res.locals.tenancy === 'hub');
     1338    const { newerPost, olderPost } = postNeighbors(site, post);
    13471339    return renderPage(req, res, 'pages/paid-gate', {
    13481340      pageTitle: post.title || 'Voor supporters',
     
    13641356    // Same Newer/Older navigation as on a normal post, so the visitor doesn't get
    13651357    // stuck on the fan gate but can keep browsing.
    1366     const { newerPost, olderPost } = postNeighbors(site, post, res.locals.tenancy === 'hub');
     1358    const { newerPost, olderPost } = postNeighbors(site, post);
    13671359    return renderPage(req, res, 'pages/fan-gate', {
    13681360      pageTitle: post.title || 'Alleen voor fans',
     
    13961388  // Prev / next chronological (kept for back-compat — "post-nav" feature
    13971389  // below the article still uses these as a simple linear navigation).
    1398   // Hub mode: Related posts + Newer/Older pull from ALL users (all sites),
    1399   // newest first. Solo mode: within the current site (old behaviour).
    1400   const isHub = res.locals.tenancy === 'hub';
    1401   // Per-post URL base: in hub a link points to /user/<site-slug>/<post-slug>.
    1402   const urlBaseFor = (p) => (isHub && p && p.site_slug) ? `/user/${p.site_slug}` : '';
     1390  const urlBaseFor = () => '';
    14031391
    14041392  // Newer/Older across ALL posts (shared helper — also used by the fan gate).
    1405   const { newerPost, olderPost } = postNeighbors(site, post, isHub);
     1393  const { newerPost, olderPost } = postNeighbors(site, post);
    14061394
    14071395  // ── Related posts: same-tag matching with recency fallback ─────
    14081396  // Fetch ~50 candidates, score by tag overlap, take top 3.
    14091397  // Excluding self via `id != ?`.
    1410   const candidates = isHub
    1411     ? db.prepare(`
    1412         SELECT p.id, p.slug, p.title, p.cover_image_url, p.cover_video_url, p.published_at, p.tags, p.nsfw, p.content_warning, s.slug AS site_slug
    1413         FROM posts p JOIN sites s ON s.id = p.site_id
    1414         WHERE p.status = 'published' AND p.id != ?
    1415         ORDER BY p.published_at DESC LIMIT 50
    1416       `).all(post.id)
    1417     : db.prepare(`
    1418         SELECT id, slug, title, cover_image_url, cover_video_url, published_at, tags, nsfw, content_warning
    1419         FROM posts
    1420         WHERE site_id = ? AND status = 'published' AND id != ?
    1421         ORDER BY published_at DESC LIMIT 50
    1422       `).all(site.id, post.id);
     1398  const candidates = db.prepare(`
     1399    SELECT id, slug, title, cover_image_url, cover_video_url, published_at, tags, nsfw, content_warning
     1400    FROM posts
     1401    WHERE site_id = ? AND status = 'published' AND id != ?
     1402    ORDER BY published_at DESC LIMIT 50
     1403  `).all(site.id, post.id);
    14231404
    14241405  // Parse tags JSON safely; missing/malformed → empty array.
Note: See TracChangeset for help on using the changeset viewer.