source: Klonkt/scripts/import-archive.mjs@ 58cfe5f

main
Last change on this file since 58cfe5f was 58cfe5f, checked in by roboburr <roboburr@…>, 5 weeks ago

De importer (shaer-pmr)

ArchiveImportService leest het formaat terug, plus een CLI
(scripts/import-archive.mjs) met droogloop en --overwrite. De vier eisen uit het
document staan expliciet in de code:

VERSIE EERST een hogere onbekende formatVersion wordt in zijn GEHEEL

geweigerd; half lezen ziet eruit alsof het gelukt is

IDENTITEIT gelijke origin -> AP-ids behouden, anders nieuwe ids met een

waarschuwing. De importer stelt dat zelf vast; een verkeerd
antwoord publiceert objecten onder een id dat je niet beheert

NIETS STILS ontbrekende media worden geteld en gemeld, en een archief dat

zijn eigen bestand mist is een APARTE melding -- dat is een
kapot archief, geen verdwenen media

GEEN UITZENDING geen Update de fediverse in

Botsingsregel, gedocumenteerd en niet per post gegokt: een bestaande post met
hetzelfde id of dezelfde slug wordt OVERGESLAGEN. Dat maakt de import idempotent
en zorgt dat je nooit per ongeluk vernietigt wat er al staat. --overwrite doet
het wel, expliciet.

Media gaan terug naar hun oorspronkelijke pad onder /media, want de content van
de post wijst daarheen; dat pad is site-relatief en werkt dus ook op een ander
domein. Checksum wordt gecontroleerd voordat er iets wordt weggeschreven, en een
pad buiten MEDIA_ROOT nooit. Gehoste audio krijgt zijn media- en audio_tracks-rij
terug, anders valt [[track:]] op niets terug -- daarvoor draagt shaer:audio nu
een shaer:media-verwijzing, die in het formaat ontbrak.

readable/ wordt nooit gelezen, en daar is een test voor: vul het met onzin en er
verandert niets.

De zip-lezer kent ook deflate. Een lezer die alleen onze eigen store-only zip
aankan is geen uitwisselformaat maar een prive-doosje.

DERDE VONDST UIT ECHTE DATA vandaag: bij de rondgang op beta bleek poll_json.closed
weg te vallen. Een poll die je vroegtijdig sluit met een einddatum in de toekomst
stond na een herstel weer open. AS2 kent daar "closed" voor op een Question; nu
beide kanten op.

Rondgang op echte beta-data: 4 posts, 3 media, 1 antwoordenarchief, ids behouden,
en na de fix geen enkel kolomverschil meer. 19 tests. Suite 512/512.

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

  • Property mode set to 100644
File size: 2.3 KB
Line 
1#!/usr/bin/env node
2//
3// Importeer een inhoudsarchief in een site (shaer-pmr).
4//
5// node scripts/import-archive.mjs <slug> <archief.zip|map> --dry-run
6// node scripts/import-archive.mjs <slug> <archief.zip|map>
7// node scripts/import-archive.mjs <slug> <archief.zip|map> --overwrite
8//
9// Het formaat staat in docs/EXPORT-FORMAT.md.
10//
11// Standaard wordt een bestaande post met hetzelfde id of dezelfde slug
12// OVERGESLAGEN. Dat maakt de import idempotent en zorgt dat je nooit per ongeluk
13// inhoud vernietigt die er al staat. --overwrite doet het wel, expliciet.
14//
15// Er gaat GEEN Update de fediverse in. Als andere servers een oudere kopie
16// hebben, blijft die daar staan; dat rechttrekken is een uitzending naar iedereen
17// en hoort een aparte, bewuste actie te zijn.
18
19import { readArchive, importArchive } from '../src/services/ArchiveImportService.js';
20
21const args = process.argv.slice(2);
22const vrij = args.filter((a) => !a.startsWith('-'));
23const [slug, bron] = vrij;
24
25if (!slug || !bron) {
26 console.error('gebruik: node scripts/import-archive.mjs <slug> <archief.zip|map> [--dry-run] [--overwrite]');
27 process.exit(1);
28}
29
30let files;
31try { files = readArchive(bron); }
32catch (e) { console.error(`kan het archief niet lezen: ${e.message}`); process.exit(1); }
33
34let r;
35try { r = importArchive(files, { slug, dryRun: args.includes('--dry-run'), overwrite: args.includes('--overwrite') }); }
36catch (e) { console.error(`geweigerd: ${e.message}`); process.exit(1); }
37
38console.log(`formaatversie : ${r.formatVersion}`);
39console.log(`herkomst : ${r.origin || '(geen)'}`);
40console.log(`AP-ids : ${r.idsBehouden ? 'BEHOUDEN (zelfde origin)' : 'nieuw (andere origin)'}`);
41console.log(`posts : ${r.posts}${r.overschreven ? `, waarvan ${r.overschreven} overschreven` : ''}`);
42console.log(`overgeslagen : ${r.overgeslagen} (bestonden al)`);
43console.log(`antwoorden : ${r.replies} (alleen-lezen archief)`);
44console.log(`media : ${r.media} teruggezet, ${r.mediaMissing} ontbrekend`);
45
46if (r.gemist.length) {
47 console.log('\nontbrekende media:');
48 for (const m of r.gemist.slice(0, 20)) console.log(` ${m.post} ${m.url}`);
49 if (r.gemist.length > 20) console.log(` ... en nog ${r.gemist.length - 20}`);
50}
51for (const w of r.waarschuwingen) console.log(`\nLET OP: ${w}`);
52
53if (args.includes('--dry-run')) console.log('\n--dry-run: niets geschreven.');
Note: See TracBrowser for help on using the repository browser.