Changeset 919b82d in Klonkt for test/fep1580-migration.test.js


Ignore:
Timestamp:
08/14/2026 12:29:06 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
19430fa, 2365630
Parents:
eb071a7
Message:

De shortcode in een bericht wees nergens meer heen

Robin stuurde een schermafbeelding van TikTik: het bericht toonde
[[track:8df2d8a4-...]] als kale tekst in plaats van een speler. Plus: playlists
hadden nog geen hoes.

WAAROM DIE SHORTHAND BREEKT. Zijn berichten kwamen uit de ZIP, die posts.content
letterlijk bewaart inclusief [[track:<oud id>]]. Zijn nummers kwamen uit de
PULL, en die gaf ze een nieuw id. De tekst wees dus naar een nummer dat hier
niet bestaat, en dan valt de weergave terug op de code zelf. Twee wegen die
allebei werken en samen niet.

Na de tracks worden die verwijzingen nu bijgetrokken, met een kaart van het
RUWE bron-id naar het onze. Alleen waar het id echt veranderde.

Onderweg bleek de outbox de shorthand overigens al gebakken door te geven, als
een link terug naar de oude site. Dus via de pull alleen zag je dit niet, en
via de zip alleen ook niet. Alleen de combinatie.

EN DEZELFDE VAL BIJ POSTS. Robin schreef dat hij de berichten handmatig zou
verwijderen om opnieuw op te halen. Dat had niet gewerkt: de mapping in
ap_migration zei "al gehad" en dan werd alles overgeslagen, hoe leeg de site
ook was. Nu telt de mapping alleen als het bericht er OOK nog staat; is het weg,
dan is opnieuw ophalen precies wat je bedoelt.

Gemeten door de combinatie na te spelen: post via de zip met [[track:t-a]],
daarna ophalen. De inhoud werd [[track:3bc1f5d9-...]] en dat nummer bestaat.

Changed files:
src/services/MigrationService.js

  • ruwId() en ruwKaart: het id zoals het in de posttekst staat
  • na de tracks worden [[track:]]-verwijzingen bijgetrokken
  • een verwijderd bericht wordt opnieuw opgehaald in plaats van overgeslagen
  • de hoes van een playlist wordt opgehaald uit icon/image
  • nieuw rapportveld opnieuw

test/fep1580-migration.test.js

  • de shorthand-herschrijving, en een verwijderd bericht dat terugkomt

remarks: over AP komen posts binnen met een gebakken link naar de OUDE site in
plaats van de shorthand. Dat werkt, maar het verwijst wel naar een domein dat je
gaat opzeggen. Aparte kwestie, nog niet aangepakt. Suite 990 groen; tegenproef
op beide fixes.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/fep1580-migration.test.js

    reb071a7 r919b82d  
    458458});
    459459
     460test('een bericht dat je zelf hebt verwijderd komt bij een tweede ronde terug', async () => {
     461  // Robin: "ik kan handmatig deze keer de posts verwijderen en opnieuw ophalen."
     462  // Met de eerste opzet kon dat niet: de mapping in ap_migration zei "al gehad"
     463  // en dan werd alles overgeslagen, hoe leeg je site ook was. Dezelfde val als
     464  // bij de nummers, en juist deze zou hij als eerste tegenkomen.
     465  const s = site({ aliases: [BRON] });
     466  const deps = bronnetje({ items: [note(`${BRON}/notes/1`), note(`${BRON}/notes/2`)] });
     467
     468  const r1 = await stil(() => Mig.ingestFromSource(s, { deps }));
     469  assert.equal(r1.posts, 2);
     470
     471  // Eentje weg, de mapping blijft staan.
     472  const weg = db.prepare('SELECT id FROM posts LIMIT 1').get().id;
     473  db.prepare('DELETE FROM posts WHERE id = ?').run(weg);
     474  assert.equal(db.prepare('SELECT COUNT(*) n FROM posts').get().n, 1);
     475
     476  const r2 = await stil(() => Mig.ingestFromSource(s, { deps }));
     477  assert.equal(r2.posts, 1, 'het verwijderde bericht hoort terug te komen');
     478  assert.equal(r2.opnieuw, 1, 'en het verslag zegt dat het opnieuw is opgehaald');
     479  assert.equal(r2.overgeslagen, 1, 'terwijl het bericht dat er nog stond met rust blijft');
     480  assert.equal(db.prepare('SELECT COUNT(*) n FROM posts').get().n, 2, 'geen dubbele');
     481});
     482
     483test('de [[track:]]-verwijzing in een bericht wordt bijgetrokken', async () => {
     484  // Wat Robin op TikTik zag: het bericht toonde de shorthand zelf in plaats van
     485  // een speler. Zijn posts kwamen uit de ZIP (die bewaart posts.content
     486  // letterlijk, inclusief [[track:<oud id>]]) en zijn nummers uit de PULL (die
     487  // gaf ze een nieuw id). De tekst wees dus naar een nummer dat hier niet
     488  // bestaat, en dan valt hij terug op de kale code.
     489  const s = site({ aliases: [BRON] });
     490  db.prepare(`INSERT INTO posts (id, site_id, author_id, slug, title, content, status, published_at)
     491              VALUES ('pz','s1','u1','tiktik','TikTik','<p>[[track:t-oud]]</p>','published','2026-08-13T10:00:00Z')`).run();
     492
     493  const kaart = new Map([
     494    [BRON, { id: BRON, type: 'Person', movedTo: IK, outbox: `${BRON}/outbox`, streams: [`${BRON}/tracks`] }],
     495    [`${BRON}/outbox`, { type: 'OrderedCollection', orderedItems: [] }],
     496    [`${BRON}/tracks`, {
     497      type: 'OrderedCollection',
     498      orderedItems: [{
     499        id: `${BRON}/tracks/t-oud`, type: 'Audio', name: 'Nummer',
     500        url: [{ type: 'Link', href: `${BRON}/audio/x.mp3`, mediaType: 'audio/mpeg' }],
     501      }],
     502    }],
     503  ]);
     504  await stil(() => Mig.ingestFromSource(s, {
     505    deps: {
     506      getJson: async (_slug, url) => kaart.get(url) || null,
     507      noteId: (b, id) => `${b}/ap/notes/${id}`,
     508      noteVisibility: AP.noteVisibility,
     509      audioRoot: '/nep/audio', mediaRoot: '/nep/media',
     510      signHeaders: () => ({ Signature: 'nep' }),
     511      safeFetch: async () => ({ ok: true, arrayBuffer: async () => Buffer.from('x'), headers: { get: () => 'audio/mpeg' } }),
     512      fs: { mkdirSync() {}, writeFileSync() {} },
     513      path,
     514    },
     515  }));
     516
     517  const inhoud = db.prepare("SELECT content FROM posts WHERE id = 'pz'").get().content;
     518  const m = /\[\[track:([^\]]+)\]\]/.exec(inhoud);
     519  assert.ok(m, 'de shorthand blijft staan, alleen het id verandert');
     520  assert.notEqual(m[1], 't-oud', 'het oude id wijst hier nergens heen');
     521  const bestaat = db.prepare('SELECT 1 FROM audio_tracks WHERE id = ? AND site_id = ?').get(m[1], 's1');
     522  assert.ok(bestaat, 'en het nieuwe id hoort bij een nummer dat er echt is');
     523});
     524
    460525test('een niet-publiek bericht komt wel mee maar niet in de publieke tabel', async () => {
    461526  const s = site({ aliases: [BRON] });
Note: See TracChangeset for help on using the changeset viewer.