Changeset 19430fa in Klonkt for test/archive-import.test.js


Ignore:
Timestamp:
08/14/2026 12:40:43 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
5a49eba
Parents:
919b82d
Message:

GUID's blijven altijd behouden bij een verhuizing

Robin vroeg of we bestaande GUID's hergebruiken. Het antwoord was zes vakjes:

zip ophaalknop

posts nieuw bij andere origin altijd nieuw
tracks OUD BEHOUDEN altijd nieuw
playlists OUD BEHOUDEN altijd nieuw

Vier keer nieuw, twee keer niet, en die twee uitzonderingen waren niet
besloten maar ontstaan: de zip schreef INSERT OR REPLACE met het id uit het
archief zonder dat daar ooit over nagedacht is. Die scheve tabel was precies de
oorzaak van de shortcode die Robin op TikTik zag: post uit de zip met
[[track:oud]], nummer uit de pull met een nieuw id.

Zijn besluit: altijd behouden. Nu is het één regel.

WAAROM DAT MAG. Het interne id is niet de AP-URI. https://nieuw/ap/notes/<id>
is een ander adres dan https://oud/ap/notes/<id>, dus je claimt niets van een
ander door het GUID te hergebruiken. Het oude argument in de code ("een id op
andermans domein publiceren is een vervalsingsoppervlak") haalde die twee door
elkaar. Wat je wint: elke interne verwijzing blijft kloppen, [[track:]],
[[playlist:]] en [[album:]] wijzen na de verhuizing nog naar het goede ding.

Wat NIET verandert is de AP-URI. Die is domeingebonden en hoort nieuw te zijn,
en daar is de migration-collectie voor. idsBehouden gaat voortaan alleen daar
nog over.

Gemeten door dezelfde inhoud via BEIDE routes over elkaar heen te halen:

posts oud 6 | nieuw 6 | zelfde id 6 | afwijkend 0
audio_tracks oud 3 | nieuw 3 | zelfde id 3 | afwijkend 0
playlists oud 1 | nieuw 1 | zelfde id 1 | afwijkend 0

Geen dubbele. Zip en ophaalknop zijn daarmee inwisselbaar geworden, en dat was
eerder de combinatie die stukging.

Changed files:
src/services/ArchiveImportService.js

  • posts houden hun id, ongeacht de origin
  • de waarschuwing zegt nu wat er echt verandert: het AP-adres, niet het id

src/services/MigrationService.js

  • posts, tracks en playlists nemen het id van de bron over
  • "staat hij hier al" is daarmee een blik in de tabel in plaats van een omweg via ap_migration; verwijderen en opnieuw ophalen werkt vanzelf
  • de eerderPl/eerder-omwegen konden weg

test/archive-import.test.js

  • de origin-test omgedraaid: het AP-adres verandert, het id blijft

test/fep1580-migration.test.js

  • de shortcode-test toetst nu de UITKOMST (wijst naar een bestaand nummer) in plaats van de route ernaartoe
  • nieuwe test voor het botsingsgeval, waar het bijtrekken wel nodig is

remarks: het bijtrekken van [[track:]] blijft bestaan als vangnet voor een
botsend id. In het normale geval doet het niets meer, en dat is de bedoeling.
Suite 991 groen.

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

File:
1 edited

Legend:

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

    r919b82d r19430fa  
    126126});
    127127
    128 test('een andere origin levert NIEUWE ids op, met een waarschuwing', () => {
    129   // Oude ids houden op een ander domein zou objecten publiceren onder een id dat
    130   // je niet beheert -- andere servers halen dat daar op, en het is bovendien een
    131   // vervalsingsoppervlak.
     128test('een andere origin geeft een nieuw AP-adres, maar het interne id BLIJFT', () => {
     129  // Omgedraaid op 14-8 (Robin: "altijd behouden"). Het interne id is niet
     130  // hetzelfde als de AP-URI: https://nieuw/ap/notes/<id> is een ander adres dan
     131  // https://oud/ap/notes/<id>, dus je claimt niets van een ander door het GUID
     132  // te hergebruiken. Wat je wint is dat elke INTERNE verwijzing blijft kloppen.
     133  //
     134  // Het oude gedrag brak precies dat: een post uit de zip hield
     135  // [[track:<oud id>]] in zijn tekst terwijl het nummer een nieuw id kreeg, en
     136  // dan zie je de shorthand als kale tekst in je bericht staan.
    132137  leeg();
    133138  const files = new Map(ARCHIEF.files);
     
    136141  files.set('manifest.json', Buffer.from(JSON.stringify(m)));
    137142  const r = AI.importArchive(files, { slug: 'me' });
    138   assert.equal(r.idsBehouden, false);
     143  assert.equal(r.idsBehouden, false, 'de AP-URI verandert wel, en dat blijft gemeld');
    139144  assert.match(r.waarschuwingen.join(' '), /origin verschilt/);
    140   assert.equal(db.prepare("SELECT COUNT(*) AS n FROM posts WHERE id = 'zwaar'").get().n, 0);
    141   assert.equal(db.prepare('SELECT COUNT(*) AS n FROM posts').get().n, 1, 'wel geimporteerd, met een nieuw id');
     145  assert.equal(db.prepare("SELECT COUNT(*) AS n FROM posts WHERE id = 'zwaar'").get().n, 1,
     146    'het interne id komt ongewijzigd terug');
     147  assert.equal(db.prepare('SELECT COUNT(*) AS n FROM posts').get().n, 1);
    142148});
    143149
Note: See TracChangeset for help on using the changeset viewer.