Changeset 861c228 in Klonkt for src/services/MigrationService.js


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@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/MigrationService.js

    r9f9b45f r861c228  
    239239
    240240const AFBEELDING = /^image\//i;
     241
     242/**
     243 * Links naar de BRONPOSTS ombuigen naar hier.
     244 *
     245 * De gebakken content zit vol met https://oud/<slug>#track-<id> en
     246 * https://oud/<slug>?fc=2: de "luister op"-links die buildNote maakt. Die
     247 * blijven naar de oude site wijzen, en dat is een tijdbom, want zodra dat
     248 * domein opgezegd wordt zijn het dode links in je eigen berichten.
     249 *
     250 * Kan pas als ALLE posts binnen zijn, en alleen voor een slug die hier echt
     251 * bestaat. Een link naar iets dat we niet hebben laten we met rust: dan is een
     252 * verwijzing naar de oude site nog altijd beter dan een 404 op de nieuwe.
     253 *
     254 * De #track-<id>-fragmenten kloppen vanzelf, want sinds "altijd behouden" is
     255 * dat id hier hetzelfde.
     256 */
     257export function postLinksBijtrekken(site, bronOrigin, rapport = {}) {
     258  if (!bronOrigin) return 0;
     259  let n = 0;
     260  const rijen = db.prepare('SELECT id, content FROM posts WHERE site_id = ? AND content LIKE ?')
     261    .all(site.id, `%${bronOrigin}/%`);
     262  if (!rijen.length) return 0;
     263  const heeftSlug = db.prepare('SELECT 1 FROM posts WHERE site_id = ? AND slug = ?');
     264  const upd = db.prepare('UPDATE posts SET content = ? WHERE id = ?');
     265  const patroon = new RegExp(`${bronOrigin.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}/([A-Za-z0-9._~-]+)`, 'g');
     266  for (const r of rijen) {
     267    let inhoud = String(r.content || '');
     268    let raak = false;
     269    for (const m of [...new Set([...inhoud.matchAll(patroon)].map((x) => x[1]))]) {
     270      // media en audio lopen via hun eigen weg; hier gaat het om postpagina's
     271      if (m === 'media' || m === 'audio' || m === 'ap') continue;
     272      if (!heeftSlug.get(site.id, m)) continue;
     273      inhoud = inhoud.split(`${bronOrigin}/${m}`).join(`/${m}`);
     274      raak = true;
     275    }
     276    if (raak) { upd.run(inhoud, r.id); n++; }
     277  }
     278  if (n) {
     279    rapport.linksBijgetrokken = n;
     280    console.log('[FEP-1580] postlinks bijgetrokken in', n, 'bericht(en)');
     281  }
     282  return n;
     283}
    241284
    242285/**
     
    770813    }
    771814
     815    // Postlinks eerst: pas nu zijn ALLE berichten binnen, dus pas nu weten we
     816    // welke slugs hier bestaan.
     817    postLinksBijtrekken(site, bronOrigin, rapport);
     818
    772819    // ── De verwijzingen in de tekst bijtrekken ────────────────────
    773820    //
Note: See TracChangeset for help on using the changeset viewer.