Changeset e4119c2 in Klonkt for src/routes


Ignore:
Timestamp:
10/29/2026 05:35:25 PM (4 hours ago)
Author:
Bart <bart@…>
Branches:
main
Children:
3155d8c
Parents:
7ccdced
Message:

Inbox: oudere pagina's via next, voor 'Load more' (shaer-ewrt)

De volle lezing gaf vier poten van de nieuwste zestig en daaronder niets.
Nu ?before=<stempel|ref> als OrderedCollectionPage met next, afgekapt over
alle poten samen; de wortel krijgt een next erbij en verder niets.

Co-Authored-By: Claude Opus 5.5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r7ccdced re4119c2  
    965965    }, 'private, no-store');
    966966  }
     967  // ── Ouder dan wat je hebt (shaer-ewrt) ──────────────────────────
     968  //
     969  // De volle lezing hieronder is vier poten van de nieuwste zestig, en wat
     970  // daaronder lag was nergens te vragen: een 'load more' had geen adres. Dit is
     971  // dat adres, met een samengestelde cursor zoals bij /messages, en het antwoord
     972  // is een OrderedCollectionPage met partOf -- een deel, en dat zegt het ook.
     973  //
     974  // De pagina's volgen elkaar via `next`; de client bouwt er geen na.
     975  const inboxId = `${base}/ap/users/${auth.site.slug}/inbox`;
     976  const size = req.query.limit ? `&limit=${encodeURIComponent(String(req.query.limit))}` : '';
     977  const ouderLink = (pagina) => (pagina.more && pagina.oldest
     978    ? `${inboxId}?before=${encodeURIComponent(pagina.oldest)}${size}` : undefined);
     979  if (req.query.before) {
     980    const pagina = AP.inboxPage(auth.site.slug, { before: String(req.query.before), limit: req.query.limit });
     981    const ids = (leg) => pagina.rows.filter((r) => r.leg === leg).map((r) => r.ref);
     982    const tl = new Map(AP.timelineRowsByIds(auth.site.slug, ids('timeline')).map((r) => [r.id, r]));
     983    const mn = new Map(AP.messageRowsByUri(auth.site.slug, ids('message')).map((r) => [r.object_uri, r]));
     984    const rp = new Map(AP.replyRowsByUri(auth.site.slug, ids('reply')).map((r) => [r.object_uri, r]));
     985    const reacties = AP.getReactionsFor(auth.site.slug, [...tl.keys()]);
     986    const ctx = { base, me, myHandle, p: P };
     987    const mine = AP.selfAuthor(base, auth.site);
     988    const items = [];
     989    for (const r of pagina.rows) {
     990      if (r.leg === 'timeline') {
     991        const t = tl.get(r.ref);
     992        if (t) items.push(timelineItem(t, { p: P, reactions: reacties }));
     993      } else if (r.leg === 'message') {
     994        // Dezelfde poort als de volle lezing: een dichte berichtenpoort houdt
     995        // vreemden buiten, nooit de hulpvraag en nooit de guardians.
     996        const m = mn.get(r.ref);
     997        if (m && (messagesAllowed || m.help_request || guardianUris.has(m.actor_uri))) items.push(messageItem(m, ctx));
     998      } else if (r.leg === 'reply') {
     999        const m = rp.get(r.ref);
     1000        if (m) items.push(replyItem(m, ctx));
     1001      } else {
     1002        const n = AP.getOutboxNote(base, r.ref);
     1003        if (n) items.push(sentItem(n, { me, mine }));
     1004      }
     1005    }
     1006    return AP.sendAP(res, {
     1007      '@context': AP.AP_CONTEXT,
     1008      id: `${inboxId}?before=${encodeURIComponent(String(req.query.before))}${size}`,
     1009      type: 'OrderedCollectionPage',
     1010      partOf: inboxId,
     1011      orderedItems: items,
     1012      // Ontbreekt next, dan is de inbox op. De client hoort dat te weten zonder
     1013      // te gokken, anders kan zijn knop niet eerlijk verdwijnen.
     1014      next: ouderLink(pagina),
     1015    }, 'private, no-store');
     1016  }
    9671017  const rows = AP.getTimeline(auth.site.slug, 60);
    9681018  // Eén query voor de hele pagina (shaer-9e9 fase 2): shaer:liked komt uit de
    … …  
    10211071    totalItems: items.length,
    10221072    orderedItems: items,
     1073    // Waar het oudere begint (shaer-ewrt). Een `next` op de wortel en geen
     1074    // `first`, en dat is een afweging: de items hierboven ZIJN de eerste
     1075    // pagina, en een `first` ernaast laat een lezer die de paginaweg voorrang
     1076    // geeft -- de onze, op iOS en op Android -- bij elke verversing de hele
     1077    // inbox opnieuw in pagina's binnenhalen. `next` volgt niemand vanzelf; hij
     1078    // is er voor wie erom vraagt.
     1079    //
     1080    // De cursor komt uit dezelfde unie als de pagina's, over de nieuwste zestig
     1081    // van alle poten samen. Die zitten hier allemaal tussen, dus de volgende
     1082    // pagina sluit aan zonder gat; wat de wortel per poot dieper had komt daar
     1083    // hooguit nog een keer langs.
     1084    next: ouderLink(AP.inboxPage(auth.site.slug, { limit: req.query.limit || 60 })),
    10231085  });
    10241086  return undefined;
Note: See TracChangeset for help on using the changeset viewer.