Changeset 7842ca1 in Klonkt for src/server.js


Ignore:
Timestamp:
08/06/2026 09:33:58 AM (5 weeks ago)
Author:
Claude (agent) <aiclaude@…>
Branches:
main
Children:
25f2e64
Parents:
6bc5ebd
git-author:
Robin <roboburr@…> (08/06/2026 09:33:57 AM)
git-committer:
Claude (agent) <aiclaude@…> (08/06/2026 09:33:58 AM)
Message:

Reactie-migratie draait bij boot, inclusief hersleutelen (shaer-9e9)

Een upgrade naar de fase-2-code was tot nu toe onveilig. Het schema migreert
vanzelf (ensureColumn bij boot), maar voor data was er niets: de backfill was een
handmatig script. Bij een vloot die met klonkt-update in een stap naar nieuwe code
gaat wordt dat vergeten, en het falen is stil -- een reactie die niemand meer
ziet geeft geen fout, en de gebruiker klikt gewoon opnieuw, met een tweede Like
de fediverse in als gevolg.

migrateReactions() draait nu bij boot, één keer per REACTIONS_MIGRATION_VERSION,
op dezelfde manier als selfHealTimeline. Twee stappen:

HERSLEUTELEN De oude interact-route bewaarde de URI waarmee je binnenkwam, en

de bookmarklet geeft window.location.href door -- dus de
permalink. Sinds canonicalReactionUri op de object-URI gezocht
wordt, zouden die rijen wees zijn. Dit gat zat NIET in mijn
eerste backfill-script; dat vulde alleen aan vanuit de kolommen
en zag deze rijen niet. Op dev viel het niet op omdat daar alles
al canoniek stond.

AANVULLEN Alles wat op oude code via de Krant is gegeven staat alleen in

ap_timeline.liked/boosted.

Volgorde binnen het hersleutelen: eerst de canonieke variant erbij, dan de
permalink weg. Een onderbreking levert dan hooguit een dubbele rij op en nooit
een verdwenen reactie. Bij hersleutelen reist created_at mee; bij aanvullen
bestaat die informatie niet en wordt het de migratiedatum.

Mislukt de migratie, dan wordt de versievlag niet gezet en probeert de volgende
boot het opnieuw. De kolommen blijven staan, dus de oude waarheid is intussen
niet weg.

Het losse script is nu een schil om diezelfde functie, met --dry-run en --force.
Twee implementaties van een migratie lopen uiteen, en dan repareert de ene wat de
andere niet ziet.

Droogloop tegen de dev-database: 0 te hersleutelen, 0 aan te vullen -- die is al
schoon, wat meteen de idempotentie bevestigt. Suite 438/438.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/server.js

    r6bc5ebd r7842ca1  
    6565import apRoutes from './routes/activitypub.js';
    6666import oauthRoutes from './routes/oauth.js';
    67 import { apWants, startDeliveryWorker, selfHealTimeline } from './services/ActivityPubService.js';
     67import { apWants, startDeliveryWorker, selfHealTimeline, migrateReactions } from './services/ActivityPubService.js';
    6868
    6969// SESSION_SECRET: use the env var if set. Otherwise auto-generate a strong one
     
    197197startScheduler(); // release planning: publish scheduled posts when publish_at is reached
    198198startDeliveryWorker(); // retry failed fediverse deliveries with backoff
     199// Once per REACTIONS_MIGRATION_VERSION bump: reacties naar de tussentabel, onder
     200// de canonieke object-URI. Moet VOOR het serveren, want vanaf nu leest de code
     201// die tabel -- draait hij niet, dan tonen oude likes als niet-gegeven.
     202migrateReactions();
    199203selfHealTimeline(); // once per SELFHEAL_VERSION bump: re-sync the fediverse cache (covers/edits) after a drastic update
    200204
Note: See TracChangeset for help on using the changeset viewer.