Changeset 861c228 in Klonkt for test


Ignore:
Timestamp:
08/14/2026 01:43:59 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
dc802b4
Parents:
9f9b45f
Message:

Gebakken links wijzen voortaan naar hier, in beide routes

Robin: de gebakken tracklinks moeten de nieuwe links worden. Terecht, en ik had
ze te makkelijk afgedaan als "geen plaatje, dus niet mijn probleem". Het zijn
tijdbommen: buildNote zet https://oud/<slug>#track-<id> en ?fc=2 in de content,
en zodra dat domein opgezegd wordt staan er dode links in je eigen berichten.

Ze kunnen nu ook echt om, en dat is te danken aan "altijd behouden" van
vanmiddag: slug en track-id zijn hier hetzelfde, dus alleen de host hoeft eraf
en het fragment klopt vanzelf.

DE REGEL: alleen ombuigen voor een slug die hier ECHT bestaat. Wijst een link
naar iets dat we niet hebben, dan blijft hij naar de oude site wijzen. Een
verwijzing naar een pagina die er nog is, is beter dan een 404 op de nieuwe.

Pas aan het EIND van de ronde, want dan pas weten we welke slugs binnen zijn.
Bij een verse ingest zou de helft van de links nog niet te beoordelen zijn.

EN IN BEIDE ROUTES ("het moet wel gebeuren bij migratie direct ook"). Een
zip-import is net zo goed een verhuizing. Daar draait het binnen dezelfde
transactie: half bijgetrokken is erger dan niet.

Changed files:
src/services/MigrationService.js

  • postLinksBijtrekken(), geexporteerd zodat de zip hem ook kan draaien
  • aangeroepen zodra alle berichten binnen zijn

src/services/ArchiveImportService.js

  • dezelfde stap aan het eind van de import, in de transactie
  • rapportveld linksBijgetrokken

src/views/pages/admin-migrate.ejs

  • in het import- en het ophaalverslag

src/services/i18n.js

  • mig.r_links_fixed in nl/en/de

test/fep1580-migration.test.js

  • fragment en querystring blijven heel, een onbekende slug blijft met rust

test/archive-audio.test.js

  • dezelfde eis voor de zip-route

remarks: /media, /audio en /ap worden overgeslagen; die lopen via hun eigen weg.
Suite 1000 groen, tegenproef op allebei de routes.

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

Location:
test
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • test/archive-audio.test.js

    r9f9b45f r861c228  
    234234});
    235235
     236test('ook een zip-import buigt links naar de bronpost om', () => {
     237  // Robin: "het moet wel gebeuren bij migratie direct ook". Een zip-import is
     238  // net zo goed een verhuizing, dus dezelfde regel.
     239  leeg();
     240  try { db.prepare('DELETE FROM posts').run(); } catch { /* leeg */ }
     241  db.prepare(`INSERT INTO posts (id, site_id, author_id, slug, title, content, status, published_at)
     242              VALUES ('pl1','s1','u1','tiktik','TikTik','<p><a href="https://oud.test/tiktik?fc=2">luister</a></p>','published','2026-01-01T10:00:00Z')`).run();
     243  const uit = AX.buildArchive('me');
     244
     245  db.prepare('DELETE FROM posts').run();
     246  // De import doet alsof het archief van oud.test komt; deze site is oud.test
     247  // niet, dus de links moeten om.
     248  const files = new Map(uit.files);
     249  const man = JSON.parse(files.get('manifest.json').toString('utf8'));
     250  man.origin = 'https://oud.test';
     251  files.set('manifest.json', Buffer.from(JSON.stringify(man)));
     252
     253  const r = AI.importArchive(files, { slug: 'me', origin: 'https://nieuw.test' });
     254  const c = db.prepare("SELECT content FROM posts WHERE slug = 'tiktik'").get().content;
     255  assert.ok(c.includes('href="/tiktik?fc=2"'), `omgebogen naar hier, kreeg: ${c}`);
     256  assert.ok(!c.includes('oud.test'), 'niets wijst meer naar de bron');
     257  assert.equal(r.linksBijgetrokken, 1, 'en het verslag zegt het');
     258});
     259
    236260test.after(() => { try { fs.rmSync(TMP, { recursive: true, force: true }); } catch { /* niets */ } });
  • test/fep1580-migration.test.js

    r9f9b45f r861c228  
    577577});
    578578
     579test('links naar de bronpost buigen om naar hier, in dezelfde ronde', async () => {
     580  // De gebakken "luister op"-links: buildNote zet
     581  // https://oud/<slug>#track-<id> en ?fc=2 in de content. Die bleven naar de
     582  // oude site wijzen, en dat is een tijdbom: zodra dat domein weg is staan er
     583  // dode links in je eigen berichten. Slugs en track-ids blijven behouden, dus
     584  // de fragmenten kloppen vanzelf zodra de host eraf is.
     585  const s = site({ aliases: [BRON] });
     586  const OUD = 'https://oud.example';
     587  const kaart = new Map([
     588    [BRON, { id: BRON, type: 'Person', movedTo: IK, outbox: `${BRON}/outbox` }],
     589    [`${BRON}/outbox`, { type: 'OrderedCollection', totalItems: 2, first: `${BRON}/outbox?page=1` }],
     590    [`${BRON}/outbox?page=1`, { type: 'OrderedCollectionPage', orderedItems: [
     591      note(`${BRON}/notes/tiktik`, { url: `${OUD}/tiktik`, content:
     592        `<p>🎵 <a href="${OUD}/tiktik#track-t1">TikTik</a> — <a href="${OUD}/tiktik?fc=2">luister</a></p>` }),
     593      // een link naar iets dat we NIET hebben blijft met rust
     594      note(`${BRON}/notes/ander`, { url: `${OUD}/ander`, content:
     595        `<p>zie <a href="${OUD}/bestaat-hier-niet">daar</a></p>` }),
     596    ] }],
     597  ]);
     598  const r = await stil(() => Mig.ingestFromSource(s, { deps: {
     599    getJson: async (_s, url) => kaart.get(url) || null,
     600    noteId: (b, id) => `${b}/ap/notes/${id}`,
     601    noteVisibility: AP.noteVisibility,
     602  } }));
     603  assert.equal(r.posts, 2);
     604  const tik = db.prepare("SELECT content FROM posts WHERE slug = 'tiktik'").get().content;
     605  assert.ok(tik.includes('href="/tiktik#track-t1"'), `fragment blijft heel, kreeg: ${tik}`);
     606  assert.ok(tik.includes('href="/tiktik?fc=2"'), 'en de querystring ook');
     607  assert.ok(!tik.includes('oud.example'), 'er wijst niets meer naar de oude site');
     608  const ander = db.prepare("SELECT content FROM posts WHERE slug = 'ander'").get().content;
     609  assert.ok(ander.includes(`${OUD}/bestaat-hier-niet`),
     610    'een link naar iets dat hier niet bestaat blijft staan: beter de oude site dan een 404 op de nieuwe');
     611  assert.equal(r.linksBijgetrokken, 1);
     612});
     613
    579614test('een bericht dat je zelf hebt verwijderd komt bij een tweede ronde terug', async () => {
    580615  // Robin: "ik kan handmatig deze keer de posts verwijderen en opnieuw ophalen."
Note: See TracChangeset for help on using the changeset viewer.