Changeset 914eb9f in Klonkt for src/routes


Ignore:
Timestamp:
06/24/2026 03:19:11 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
d988fa0
Parents:
0dba092
Message:

feat(fediverse-client): follow accounts + home timeline

Klonkt can now follow fediverse accounts (WebFinger -> signed Follow; Accept/Reject
handled) and shows their posts in a home timeline at /tijdlijn (owner-only).
New ap_following + ap_timeline tables; inbox stores top-level posts from followed
accounts + removes them on upstream Delete. Beheer link added.

Co-Authored-By: Claude <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/posts.js

    r0dba092 r914eb9f  
    8686  'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'favorieten', 'feed.xml', 'atom.xml', 'sitemap.xml',
    8787  'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets',
    88   'authorize_interaction', 'fediverse',
     88  'authorize_interaction', 'fediverse', 'tijdlijn',
    8989]);
    9090
     
    561561  }
    562562  res.redirect(req.get('Referer') || `${res.locals.siteUrlBase || ''}/fediverse`);
     563});
     564
     565// ==================== FEDIVERSE CLIENT: home timeline + following ====================
     566router.get('/tijdlijn', requireSiteManager, (req, res) => {
     567  const site = res.locals.site;
     568  const following = site ? ActivityPubService.listFollowing(site.slug) : [];
     569  const timeline = site ? ActivityPubService.getTimeline(site.slug, 60) : [];
     570  renderPage(req, res, 'pages/timeline', {
     571    pageTitle: 'Tijdlijn', bodyClass: 'on-special',
     572    following, timeline,
     573    success: req.query.success || null, error: req.query.error || null,
     574  });
     575});
     576
     577router.post('/tijdlijn/follow', requireSiteManager, async (req, res) => {
     578  const site = res.locals.site;
     579  const handle = (req.body.handle || '').toString();
     580  let q = 'success=' + encodeURIComponent('Volgverzoek verstuurd');
     581  if (site && handle.trim()) {
     582    try {
     583      const r = await ActivityPubService.followActor(site, handle);
     584      if (r && r.error) q = 'error=' + encodeURIComponent(r.error === 'not_found' ? 'Account niet gevonden' : (r.error === 'unreachable' ? 'Server onbereikbaar' : 'Volgen mislukt'));
     585      else q = 'success=' + encodeURIComponent('Je volgt nu ' + ((r && r.name) || handle));
     586    } catch (e) { q = 'error=' + encodeURIComponent('Volgen mislukt'); }
     587  }
     588  res.redirect('/tijdlijn?' + q);
     589});
     590
     591router.post('/tijdlijn/unfollow', requireSiteManager, async (req, res) => {
     592  const site = res.locals.site;
     593  const actorUri = (req.body.actor_uri || '').toString();
     594  if (site && actorUri) { try { await ActivityPubService.unfollowActor(site, actorUri); } catch (e) { /* ignore */ } }
     595  res.redirect('/tijdlijn?success=' + encodeURIComponent('Ontvolgd'));
    563596});
    564597
Note: See TracChangeset for help on using the changeset viewer.