Ignore:
Timestamp:
08/13/2026 11:55:04 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
783b9ff
Parents:
7e9d0ea
git-author:
Robin <roboburr@…> (08/13/2026 11:54:36 AM)
git-committer:
Robin <roboburr@…> (08/13/2026 11:55:04 AM)
Message:

Paginering die echt pagineert (shaer-sk4)

Robin zag dat elke ?page= dezelfde inhoud gaf. Dat klopte, en het was geen halve
implementatie maar een omhulsel: pagedCollection veranderde alleen de VORM en
sneed nooit. first en last wezen allebei naar ?page=1, en de routes lazen
!!req.query.page -- of de parameter er STAAT, niet welke. Live gaf ?page=2 en
?page=99 dezelfde acht items, en noemden zichzelf pagina 1.

Nu: echt snijden, met next en prev, en een pagina die zijn eigen nummer
draagt. Een pagina voorbij het einde is LEEG en zegt dat ook -- hem naar de
laatste terugbuigen zou opnieuw een antwoord zijn dat over zichzelf liegt.

DE WORTEL HOUDT ZIJN ITEMS INLINE, en dat is geen slordigheid maar de reden dat
dit veilig is. Shaer leest een document en volgt next niet (KlonktClient.swift
orderedItems). Werd de wortel nu leeg, dan kreeg elke draaiende app nul items en
geen foutmelding -- dezelfde stille val waar ik op 10 augustus bij Funkwhale zelf
in trapte. Eerst de clients leren pagineren, dan pas de wortel afslanken.

WAT WEL EN NIET GEPAGINEERD IS. Volgers en following pagineren nu volledig: die
lijsten zitten al in het geheugen, dus dat kost niets extra. De outbox krijgt de
juiste VORM maar niet meer diepte: de route kapt al op twintig rijen in SQL.
Echt doorbladeren vraagt daar een LIMIT/OFFSET, en dat is lastiger dan bij
volgers omdat posts en tracks op datum door elkaar gevlochten worden en uit twee
tabellen komen -- een UNION met een offset erover, geen tweede slice. Dat staat
als naad in de code en op de bead, niet weggemoffeld.

Zeven tests, waaronder de klacht zelf: pagina 2 geeft ANDERE items dan pagina 1.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r7e9d0ea rbac4bf3  
    10321032    .sort((a, b) => wanneer(b) - wanneer(a))
    10331033    .slice(0, MAX_OUTBOX);
     1034  // WAT HIER NOG NIET GEPAGINEERD IS, en dat hoort genoemd (shaer-sk4): deze
     1035  // lijst is al door de route op twintig rijen afgekapt, dus pagina 2 is leeg.
     1036  // Echt doorbladeren vraagt een LIMIT/OFFSET in SQL -- en dat is hier lastiger
     1037  // dan bij volgers, want posts en tracks worden op DATUM door elkaar gevlochten
     1038  // en komen uit twee tabellen. Dat vraagt een UNION met een offset erover, geen
     1039  // tweede slice. De vorm klopt nu wel: pagina 2 zegt eerlijk dat hij leeg is en
     1040  // biedt geen `next` aan, in plaats van pagina 1 nog eens te geven.
    10341041  // GEPAGINEERD, ook al past alles op een pagina (Funkwhale, 11-8).
    10351042  //
     
    10491056// account owner (a C2S bearer scoped to this site) gets the real actor URIs via
    10501057// `items`, so their own client can build a friends list.
    1051 export function buildFollowers(base, site, count, items = null) {
     1058export function buildFollowers(base, site, count, items = null, { page = false } = {}) {
    10521059  const id = `${actorId(base, site.slug)}/followers`;
    10531060  // count-only for the public; full for the owner
    1054   return pagedCollection(id, items || [], { totalItems: items ? items.length : (count || 0) });
     1061  return pagedCollection(id, items || [], { totalItems: items ? items.length : (count || 0), page });
    10551062}
    10561063
    10571064// The accounts this site follows — count only, mirroring buildFollowers. The spec lists
    10581065// `following` as a standard actor property; Hubzilla/Friendica + crawlers expect it.
    1059 export function buildFollowing(base, site, count, items = null) {
     1066export function buildFollowing(base, site, count, items = null, { page = false } = {}) {
    10601067  const id = `${actorId(base, site.slug)}/following`;
    10611068  // count-only for the public; full for the owner
    1062   return pagedCollection(id, items || [], { totalItems: items ? items.length : (count || 0) });
     1069  return pagedCollection(id, items || [], { totalItems: items ? items.length : (count || 0), page });
    10631070}
    10641071
Note: See TracChangeset for help on using the changeset viewer.