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
  • test/reactions-characterization.test.js

    r0e27e54 r14f7cb2  
    212212  assert.equal(AP.getMyReactions('me', uri('sr5')).liked, false);
    213213});
     214
     215// ── Fase 2: lezen komt uit de tussentabel ────────────────────────────────
     216
     217test('getReaction leest de tussentabel, niet de kolom', () => {
     218  const u = uri('g1'); seedTimeline(u);
     219  AP.setReaction('me', u, 'like', true);
     220  assert.deepEqual(AP.getReaction('me', u), { liked: true, boosted: false });
     221  AP.setReaction('me', u, 'boost', true);
     222  assert.deepEqual(AP.getReaction('me', u), { liked: true, boosted: true });
     223});
     224
     225test('WAAROM DE BACKFILL EERST MOET: een kale kolomvlag is onzichtbaar voor getReaction', () => {
     226  // Dit is de reden dat scripts/backfill-reactions.mjs tussen fase 1 en 2 hoort.
     227  // Een reactie van vóór fase 1 staat alleen in de kolom; zodra de lezers de
     228  // tussentabel volgen is die stil verdwenen -- geen fout, geen spoor.
     229  const u = uri('g2'); seedTimeline(u);
     230  AP.markLiked('me', u);                                  // zoals de oude tijdlijn-route
     231  assert.equal(AP.getTimelineReaction('me', u).liked, true, 'de kolom staat aan');
     232  assert.equal(AP.getReaction('me', u).liked, false, 'maar het nieuwe leespad ziet hem niet');
     233  // Wat de backfill doet:
     234  AP.setMyReaction('me', u, 'like', true);
     235  assert.equal(AP.getReaction('me', u).liked, true, 'na aanvullen wel');
     236});
     237
     238test('getReactionsFor haalt een hele pagina in één keer op', () => {
     239  const a = uri('g3'), b = uri('g4'), c = uri('g5');
     240  seedTimeline(a); seedTimeline(b);
     241  AP.setReaction('me', a, 'like', true);
     242  AP.setReaction('me', b, 'boost', true);
     243  const m = AP.getReactionsFor('me', [a, b, c]);
     244  assert.equal(m.get(a).liked, true);
     245  assert.equal(m.get(b).boosted, true);
     246  assert.equal(m.get(c), undefined, 'wie niets heeft komt niet in de map; de aanroeper valt terug op false');
     247  // Dezelfde uitkomst als per stuk vragen, zodat de batch geen eigen waarheid wordt.
     248  for (const u of [a, b]) assert.deepEqual(m.get(u), AP.getReaction('me', u));
     249});
     250
     251test('getReactionsFor: lege of rommelige invoer geeft een lege map', () => {
     252  assert.equal(AP.getReactionsFor('me', []).size, 0);
     253  assert.equal(AP.getReactionsFor('me', null).size, 0);
     254  assert.equal(AP.getReactionsFor('', [uri('g3')]).size, 0);
     255});
Note: See TracChangeset for help on using the changeset viewer.