Changeset e9128bc in Klonkt for src/routes/admin-migrate.js


Ignore:
Timestamp:
08/14/2026 02:12:31 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
fc664ce
Parents:
dc802b4
Message:

Alle migratie-opties bij elkaar op één pagina

Robin: ik wil alle migratie-opties op de migrate-pagina hebben, dus ook
fediverse alias en move.

Ze stonden op de site-bewerkpagina, tussen de kleuren, de feedinstellingen en
de custom head-html. Dat is de verkeerde plek in twee opzichten: het zijn stap
1 en de laatste stap van een verhuizing, en dat scherm gaat over hoe je site
eruitziet. Een verhuizing is geen uiterlijk.

De pagina vertelt nu het verhaal in de goede volgorde:

1 je oude account claimen (alsoKnownAs)

meenemen (zip)
ophalen bij je oude Klonkt
hierheen halen (zip)

4 de verhuizing aankondigen (Move)

Claimen bovenaan omdat de bron zonder die claim niets afgeeft en de Move
weigert met no_backreference. Aankondigen onderaan met een rode knop: het is de
enige stap op deze pagina die niet terug te draaien is.

De verhuisknop post naar de BESTAANDE /admin/sites/:slug/move. Een tweede
implementatie van een onomkeerbare actie is precies wat je niet wilt; die route
kreeg alleen een next mee zodat je terugkomt waar je vandaan kwam.

EEN VAL DIE IK ONDERWEG MAAKTE. De opslagroute van het site-bewerkscherm
schreef ap_aliases uit het formulier. Haal je dat veld weg, dan komt er niets
binnen, en dan wist een gewone opslag je claim op je oude account. Je verandert
je accentkleur en drie stappen later weigert de Move met no_backreference,
zonder dat iets die twee met elkaar verbindt. Nu geldt: veld niet meegestuurd
is niet aanraken.

Changed files:
src/routes/admin-migrate.js

  • POST /admin/migrate/aliases, met de bestaande parseApAliases
  • aliassen en moved_to in de locals van alle drie de renders

src/routes/admin-sites.js

  • parseApAliases geexporteerd in plaats van gekopieerd
  • de save raakt ap_aliases alleen aan als het veld er echt is
  • /move mag terugsturen naar een eigen pad (geen open redirect)

src/views/pages/admin-migrate.ejs

  • alias bovenaan, verhuizen onderaan met een gewaarschuwde rode knop

src/views/pages/admin-site-edit.ejs

  • beide blokken eruit, een wegwijzer ervoor in de plaats

src/services/i18n.js

  • mig.alias_* en mig.move_* plus asite.moved_to_migrate, in nl/en/de

New file:
test/migrate-page.test.js

  • de velden staan op de goede pagina en niet meer op de oude
  • de volgorde: claimen boven ophalen, aankondigen onderaan
  • en een alias overleeft het opslaan van je uiterlijk

remarks: gedraaid op een echte instantie. Alias opslaan werkt, een onzin-adres
geeft een nette fout EN laat de bestaande alias staan, en de pagina rendert
schoon in nl/en/de. Suite 1005 groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-migrate.js

    rdc802b4 re9128bc  
    3535import { buildArchive, zipArchive } from '../services/ArchiveExportService.js';
    3636import { readArchiveZip, importArchive } from '../services/ArchiveImportService.js';
     37import { parseApAliases } from './admin-sites.js';
     38import db from '../config/database.js';
    3739
    3840const router = express.Router();
     
    7274}
    7375
     76/** De aliassen als tekst, een per regel, zoals het invoerveld ze wil. */
     77function aliasTekst(site) {
     78  try { return (JSON.parse((site && site.ap_aliases) || '[]') || []).join('\n'); } catch { return ''; }
     79}
     80
    7481/**
    7582 * Waar zouden we vandaan kunnen halen? De alias die we zelf claimen (FEP-7628
     
    94101    telling, fout, mb,
    95102    verslag: null,
    96     bron: bronKandidaat(site),
     103    bron: bronKandidaat(site), aliassen: aliasTekst(site), movedTo: (site && site.moved_to) || null,
    97104    mig: site ? Migration.migrationStatus(site.slug) : null,
    98105    haalVerslag: null,
     
    133140    pageTitle: 'Migreren', bodyClass: 'on-special',
    134141    telling, fout: null, mb, verslag: null,
    135     bron: opgegeven || bronKandidaat(site),
     142    bron: opgegeven || bronKandidaat(site), aliassen: aliasTekst(site), movedTo: site.moved_to || null,
    136143    mig: Migration.migrationStatus(site.slug),
    137144    haalVerslag: r,
     
    139146    error: null,
    140147  });
     148});
     149
     150/**
     151 * Je oude account claimen (FEP-7628 alsoKnownAs).
     152 *
     153 * Stond op de site-bewerkpagina, tussen de kleuren en de feedinstellingen. Maar
     154 * dit is stap EEN van een verhuizing, en zonder deze claim weigert de oude
     155 * instantie de Move met `no_backreference`. Het hoort dus hier, boven de knop
     156 * die hem nodig heeft.
     157 */
     158router.post('/aliases', requireGod, async (req, res) => {
     159  const site = res.locals.site;
     160  if (!site) return res.redirect('/admin/migrate?error=' + encodeURIComponent('Geen site'));
     161  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
     162  let lijst;
     163  try {
     164    lijst = await parseApAliases(req.body.ap_aliases, ActivityPubService.actorId(base, site.slug));
     165  } catch (e) {
     166    // Welke regel niet deugde, niet alleen DAT er iets niet deugde.
     167    return res.redirect('/admin/migrate?error=' + encodeURIComponent(`Onbruikbaar adres: ${e && e.message}`));
     168  }
     169  db.prepare('UPDATE sites SET ap_aliases = ? WHERE slug = ?').run(JSON.stringify(lijst), site.slug);
     170  res.redirect('/admin/migrate?success=' + encodeURIComponent(
     171    lijst.length ? `${lijst.length} adres(sen) opgeslagen als jouw vorige account.` : 'Aliassen leeggemaakt.'));
    141172});
    142173
     
    195226    pageTitle: 'Migreren', bodyClass: 'on-special',
    196227    telling: tellen(site).telling, fout: null, mb,
    197     bron: bronKandidaat(site), mig: Migration.migrationStatus(site.slug), haalVerslag: null,
     228    bron: bronKandidaat(site), aliassen: aliasTekst(site), movedTo: site.moved_to || null,
     229    mig: Migration.migrationStatus(site.slug), haalVerslag: null,
    198230    verslag: verslag ? { ...verslag, echt, overschrijf, bestand: req.file.originalname, bytes: req.file.buffer.length } : null,
    199231    success: (echt && verslag && !fout) ? 'Archief geïmporteerd' : null,
Note: See TracChangeset for help on using the changeset viewer.