|
Weergave gelijkgetrokken: Krant en Cirkel lezen de tussentabel (shaer-9e9)
CORRECTIE: ik meldde fase 2 als klaar, en dat was te vroeg. De Krant TEKENDE
zijn like- en boostknoppen nog uit ap_timeline.liked/boosted (tl-item.ejs leest
p.liked en p.boosted), terwijl de toggle al uit getReaction besliste. Tekenen en
beslissen leunden dus op verschillende bronnen. Ze waren het eens zolang de
migratie ze gelijk hield -- synchronisatie, geen ontwerp.
getTimeline leidt liked/boosted nu af uit de tussentabel, met dezelfde
batch-query als de C2S-tijdlijn: één extra query per pagina, geen N+1. Bewust in
JS en niet als join, want de rijen komen met SELECT * en dan zouden twee
kolommen liked heten -- welke dan wint hangt van de driver af.
getCirkelPosts kon niet in JS: die filtert in de WHERE. Daar is het een LEFT JOIN
op ap_my_reactions geworden, met (rb.target_uri IS NOT NULL) AS boosted zodat de
view ongewijzigd blijft. De UNIQUE(site_slug, target_uri, kind) garandeert
hoogstens één match, dus de join kan geen rijen verdubbelen.
boostedCount telt nu de tussentabel, nog steeds met een join op ap_timeline zodat
de betekenis gelijk blijft: geboost EN in je tijdlijn.
Twee karakteriseringstests gingen hierdoor stuk, en dat is precies waarvoor ze er
staan: ze legden vast dat een kale kolomvlag een post de Cirkel in trok. Dat is
nu niet meer waar. Bewust bijgewerkt met de reden erbij, niet weggehaald.
upsertBoostedNote blijft verantwoordelijk voor de RIJ -- zonder die insert heeft
een boost van iemand die je niet volgt geen post om bij te horen.
Daarmee leest niets in de weergave nog uit de kolommen. Ze worden alleen nog
geschreven (vangnet) en gelezen door de migratie. Dat maakt de drop een losse,
terugdraaibare beslissing in plaats van een verweven.
Geen breaking change: additief en intern, dus kandidaat voor de volgende MINOR.
Suite 441/441.
Co-Authored-By: Claude Opus 5 <noreply@…>
|