Changeset 14f7cb2 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/06/2026 09:10:41 AM (5 weeks ago)
Author:
Claude (agent) <aiclaude@…>
Branches:
main
Children:
68a4d1b
Parents:
0e27e54
git-author:
Robin <roboburr@…> (08/06/2026 09:10:40 AM)
git-committer:
Claude (agent) <aiclaude@…> (08/06/2026 09:10:41 AM)
Message:

Eén leespad voor reacties (shaer-9e9 fase 2)

De tussentabel is nu ook voor LEZEN de bron. getReaction(slug, uri) vervangt
getMyReactions en getTimelineReaction, die dezelfde vraag beantwoordden uit twee
verschillende bronnen -- de reden dat een like in de Krant en dezelfde like op de
interact-pagina een andere knopstand konden tonen.

Vijf lezers omgezet: de interact-pagina en zijn twee toggles, en de twee toggles
in de Krant. Plus de C2S-tijdlijn, waar shaer:liked en shaer:boosted niet meer
uit de afgeleide kolom komen. Die laatste gaat via getReactionsFor: één query
voor de hele pagina, want per rij vragen zou een consistentiebug hebben geruild
voor een N+1.

Mag alleen ná scripts/backfill-reactions.mjs. Een reactie van vóór fase 1 staat
alleen in de kolom en is voor getReaction onzichtbaar -- stil, want een
ontbrekende rij is geen fout. Er staat nu een test die precies dat vastlegt, zodat
de volgorde-eis uitvoerbaar is en niet alleen opgeschreven.

Robin heeft bevestigd dat de likes van 09:01 via de KRANT gingen, dus het
schrijven van fase 1 is op de webroute bewezen -- dat was de poort voor deze
stap, want anders zou de knop daar nu stuk gaan in plaats van scheef te lopen.

Suite 430/430.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r0e27e54 r14f7cb2  
    285285  const playbackAllowed = embedsAllowed
    286286    && Guardianship.externalPlaybackAllowed(auth.site.external_playback, isWard);
    287   const posts = AP.getTimeline(auth.site.slug, 60).map((t) => ({
     287  const rows = AP.getTimeline(auth.site.slug, 60);
     288  // Eén query voor de hele pagina (shaer-9e9 fase 2): shaer:liked komt uit de
     289  // tussentabel, de bron van waarheid, en niet meer uit de afgeleide kolom op
     290  // ap_timeline. Per rij vragen zou hier een N+1 opleveren.
     291  const reacties = AP.getReactionsFor(auth.site.slug, rows.map((t) => t.id));
     292  const posts = rows.map((t) => ({
    288293    id: `${t.id}#create`,
    289294    type: 'Create',
     
    333338      // Whether THIS account already liked/boosted the note, so the app's
    334339      // detail-view buttons show the current state (and can toggle/undo).
    335       'shaer:liked': !!t.liked,
    336       'shaer:boosted': !!t.boosted,
     340      'shaer:liked': !!(reacties.get(t.id) || {}).liked,
     341      'shaer:boosted': !!(reacties.get(t.id) || {}).boosted,
    337342      // An external (non-fediverse) embed, thumbnail-only and never an iframe.
    338343      // Omitted entirely when the gate is closed (see above).
Note: See TracChangeset for help on using the changeset viewer.