source: Klonkt/src/views/pages/admin-migrate.ejs@ 861c228

main
Last change on this file since 861c228 was 861c228, checked in by Robin <roboburr@…>, 4 weeks ago

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

  • Property mode set to 100644
File size: 12.2 KB
Line 
1<div class="container mig-wrap">
2 <h1><%= t('mig.title') %></h1>
3 <p class="mig-lead"><%= t('mig.lead') %></p>
4
5 <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %>
6 <% if (typeof error !== 'undefined' && error) { %><div class="alert alert-error"><%= error %></div><% } %>
7
8 <%# ── Exporteren ─────────────────────────────────────────────── %>
9 <section class="mig-card">
10 <h2><%= t('mig.export_title') %></h2>
11 <p class="form-hint"><%= t('mig.export_hint') %></p>
12
13 <% if (telling) { %>
14 <ul class="mig-counts">
15 <li><strong><%= telling.posts %></strong> <%= t('mig.c_posts') %></li>
16 <li><strong><%= telling.replies %></strong> <%= t('mig.c_replies') %></li>
17 <li><strong><%= telling.media %></strong> <%= t('mig.c_media') %></li>
18 <%# Muziek APART tellen, niet onder "media". Dit ontbrak, en juist daardoor
19 kon een export van 140 nummers er als 4,5 MB uitzien zonder dat iemand
20 het merkte: de teller zei "39 mediabestanden" en zweeg over de rest. %>
21 <% if (telling.tracks) { %>
22 <%# Wat er ECHT meegaat, niet hoeveel rijen er in de database staan.
23 "8 nummers" met daaronder "van 3 ontbreekt het bestand" telt niet
24 op; 5 plus die waarschuwing wel. %>
25 <li><strong><%= telling.tracks - (telling.audioMissing || 0) %></strong> <%= t('mig.c_tracks') %></li>
26 <% } %>
27 <% if (telling.playlists) { %>
28 <li><strong><%= telling.playlists %></strong> <%= t('mig.c_playlists') %></li>
29 <% } %>
30 <% if (typeof telling.following === 'number') { %>
31 <li><strong><%= telling.following %></strong> <%= t('mig.c_following') %></li>
32 <% } %>
33 <li><strong><%= mb(telling.bytes) %></strong> <%= t('mig.c_size') %></li>
34 </ul>
35
36 <% if (telling.ontbrekend) { %>
37 <%# Niets stils: media die op schijf ontbreekt wordt geteld en gemeld, want
38 een archief dat stilzwijgend minder bevat is erger dan een waarschuwing. %>
39 <p class="alert alert-error"><%= t('mig.missing', { n: telling.ontbrekend }) %></p>
40 <% } %>
41
42 <% if (telling.audioMissing) { %>
43 <%# Een eigen zin voor muziek. "N mediaverwijzingen" zei niets over de
44 vraag die er toe doet: gaat mijn bibliotheek mee. %>
45 <p class="alert alert-error"><%= t('mig.audio_missing', { n: telling.audioMissing }) %></p>
46 <% } %>
47
48
49 <% if (telling.groot) { %>
50 <p class="alert alert-error"><%= t('mig.too_big') %></p>
51 <% } else { %>
52 <p><a class="btn btn-primary" href="/admin/migrate/export"><%= t('mig.export_btn') %></a></p>
53 <% } %>
54 <% } else { %>
55 <p class="form-hint"><%= t('mig.export_none') %></p>
56 <% } %>
57 </section>
58
59 <%# ── Rechtstreeks ophalen (FEP-1580) ────────────────────────── %>
60 <section class="mig-card">
61 <h2><%= t('mig.pull_title') %></h2>
62 <p class="form-hint"><%= t('mig.pull_hint') %></p>
63
64 <% if (haalVerslag) { %>
65 <div class="mig-report<%= haalVerslag.error ? '' : ' is-done' %>">
66 <% if (haalVerslag.error) { %>
67 <h3><%= t('mig.pull_failed') %></h3>
68 <%# Elke weigering krijgt een eigen zin. "Er ging iets mis" laat je
69 raden welke van de twee kanten van de afspraak ontbreekt, en dat
70 is precies wat je moet weten om het op te lossen. %>
71 <p><%= t('mig.e_' + haalVerslag.error) !== 'mig.e_' + haalVerslag.error
72 ? t('mig.e_' + haalVerslag.error) : (haalVerslag.melding || haalVerslag.error) %></p>
73 <% if (haalVerslag.error === 'not_moved_here' && haalVerslag.movedTo) { %>
74 <p class="form-hint"><%= t('mig.e_points_at') %> <code><%= haalVerslag.movedTo %></code></p>
75 <% } %>
76 <% } else { %>
77 <h3><%= t('mig.pull_done') %></h3>
78 <ul class="mig-counts">
79 <li><strong><%= haalVerslag.posts %></strong> <%= t('mig.r_imported') %></li>
80 <% if (haalVerslag.overgeslagen) { %><li><strong><%= haalVerslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li><% } %>
81 <% if (haalVerslag.media) { %><li><strong><%= haalVerslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
82 <% if (haalVerslag.blocks) { %><li><strong><%= haalVerslag.blocks %></strong> <%= t('mig.r_blocks') %></li><% } %>
83 <% if (haalVerslag.tracksBinnen) { %><li><strong><%= haalVerslag.tracksBinnen %></strong> <%= t('mig.c_tracks') %></li><% } %>
84 <%# Aangevuld telt apart van nieuw. Een tweede ronde die "0 erbij"
85 meldt terwijl hij drie nummers compleet maakte, leest als niets
86 gedaan. %>
87 <% if (haalVerslag.tracksBijgewerkt) { %><li><strong><%= haalVerslag.tracksBijgewerkt %></strong> <%= t('mig.r_tracks_updated') %></li><% } %>
88 <% if (haalVerslag.postsBijgewerkt) { %><li><strong><%= haalVerslag.postsBijgewerkt %></strong> <%= t('mig.r_posts_updated') %></li><% } %>
89 <% if (haalVerslag.linksBijgetrokken) { %><li><strong><%= haalVerslag.linksBijgetrokken %></strong> <%= t('mig.r_links_fixed') %></li><% } %>
90 <% if (haalVerslag.playlistsBinnen) { %><li><strong><%= haalVerslag.playlistsBinnen %></strong> <%= t('mig.c_playlists') %></li><% } %>
91 </ul>
92 <% if (haalVerslag.tracksMislukt) { %>
93 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: haalVerslag.tracksMislukt }) %></p>
94 <% } %>
95 <% } %>
96 <% if (haalVerslag.waarschuwingen && haalVerslag.waarschuwingen.length) { %>
97 <ul class="mig-warnlist">
98 <% haalVerslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
99 </ul>
100 <% } %>
101 </div>
102 <% } %>
103
104 <form method="post" action="/admin/migrate/pull">
105 <label for="mig-bron"><%= t('mig.pull_source') %></label>
106 <input type="url" id="mig-bron" name="bron" value="<%= bron || '' %>"
107 placeholder="https://oude-klonkt.nl/ap/users/jij" class="mig-input">
108 <p class="form-hint"><%= t('mig.pull_source_hint') %></p>
109 <button type="submit" class="btn"><%= t('mig.pull_btn') %></button>
110 </form>
111
112 <% if (mig && (mig.total || mig.moves)) { %>
113 <p class="form-hint mig-state">
114 <%= t('mig.state', { n: mig.total }) %>
115 <%= mig.complete ? t('mig.state_done') : t('mig.state_busy') %>
116 </p>
117 <% } %>
118 </section>
119
120 <%# ── Importeren ─────────────────────────────────────────────── %>
121 <section class="mig-card">
122 <h2><%= t('mig.import_title') %></h2>
123 <p class="form-hint"><%= t('mig.import_hint') %></p>
124
125 <% if (verslag) { %>
126 <div class="mig-report<%= verslag.echt ? ' is-done' : '' %>">
127 <h3><%= verslag.echt ? t('mig.r_done') : t('mig.r_dry') %></h3>
128 <p class="form-hint"><%= verslag.bestand %> &middot; <%= mb(verslag.bytes) %></p>
129 <ul class="mig-counts">
130 <li><strong><%= verslag.posts %></strong> <%= verslag.echt ? t('mig.r_imported') : t('mig.r_would') %></li>
131 <li><strong><%= verslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li>
132 <% if (verslag.overschreven) { %><li><strong><%= verslag.overschreven %></strong> <%= t('mig.r_overwritten') %></li><% } %>
133 <% if (verslag.mediaMissing) { %><li><strong><%= verslag.mediaMissing %></strong> <%= t('mig.r_media_missing') %></li><% } %>
134 <% if (verslag.media) { %><li><strong><%= verslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
135 <%# Ook hier: muziek apart. Zonder deze twee regels zie je aan de
136 ontvangende kant net zo min of je bibliotheek is aangekomen. %>
137 <% if (verslag.tracks) { %><li><strong><%= verslag.tracks %></strong> <%= t('mig.c_tracks') %></li><% } %>
138 <% if (verslag.playlists) { %><li><strong><%= verslag.playlists %></strong> <%= t('mig.c_playlists') %></li><% } %>
139 <% if (verslag.linksBijgetrokken) { %><li><strong><%= verslag.linksBijgetrokken %></strong> <%= t('mig.r_links_fixed') %></li><% } %>
140 </ul>
141 <% if (verslag.tracksMissing) { %>
142 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: verslag.tracksMissing }) %></p>
143 <% } %>
144 <% if (verslag.waarschuwingen && verslag.waarschuwingen.length) { %>
145 <ul class="mig-warnlist">
146 <% verslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
147 </ul>
148 <% } %>
149 <% if (verslag.idsBehouden === false) { %>
150 <%# Dit is de belangrijkste regel van het hele verslag: komt het archief
151 van een ANDER adres, dan krijgen de posts nieuwe id's en zijn het
152 nieuwe objecten voor de fediverse. %>
153 <p class="alert alert-error"><%= t('mig.r_new_ids') %></p>
154 <% } %>
155
156 <% if (!verslag.echt && verslag.posts > 0) { %>
157 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data" class="mig-confirm">
158 <p class="form-hint"><%= t('mig.r_confirm_hint') %></p>
159 <label for="mig-file2"><%= t('mig.file_label') %></label>
160 <input type="file" id="mig-file2" name="archief" accept=".zip,application/zip" required>
161 <input type="hidden" name="echt" value="1">
162 <% if (verslag.overschrijf) { %><input type="hidden" name="overschrijf" value="1"><% } %>
163 <button type="submit" class="btn btn-primary"><%= t('mig.r_confirm_btn') %></button>
164 </form>
165 <% } %>
166 </div>
167 <% } %>
168
169 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data">
170 <label for="mig-file"><%= t('mig.file_label') %></label>
171 <input type="file" id="mig-file" name="archief" accept=".zip,application/zip" required>
172
173 <label class="mig-check">
174 <input type="checkbox" name="overschrijf" value="1">
175 <%= t('mig.overwrite_label') %>
176 </label>
177 <p class="form-hint mig-warn"><%= t('mig.overwrite_hint') %></p>
178
179 <button type="submit" class="btn"><%= t('mig.check_btn') %></button>
180 <p class="form-hint"><%= t('mig.check_hint') %></p>
181 </form>
182 </section>
183
184 <%# ── Wie je volgt ────────────────────────────────────────────── %>
185 <section class="mig-card">
186 <h2><%= t('mig.follows_title') %></h2>
187 <p class="form-hint"><%= t('mig.follows_hint') %></p>
188 <p><a class="btn" href="/connect"><%= t('mig.follows_btn') %></a></p>
189 </section>
190</div>
191
192<style>
193 .mig-wrap { max-width: 46rem; }
194 .mig-lead { color: var(--sub); margin-bottom: 1.5rem; }
195 .mig-card { border: 1px solid var(--rule); border-radius: 12px; padding: 1.25rem 1.4rem; margin-bottom: 1.25rem; }
196 .mig-card h2 { margin: 0 0 .35rem; font-size: 1.1rem; }
197 .mig-counts { list-style: none; padding: 0; margin: .9rem 0; display: flex; flex-wrap: wrap; gap: .4rem 1.4rem; }
198 .mig-counts li { color: var(--sub); font-size: .94rem; }
199 .mig-counts strong { color: var(--ink); font-size: 1.05rem; }
200 .mig-card label { display: block; margin: .9rem 0 .35rem; font-weight: 600; font-size: .92rem; }
201 .mig-card input[type="file"] { display: block; margin-bottom: .6rem; }
202 .mig-check { display: flex; align-items: center; gap: .5rem; font-weight: 400 !important; }
203 .mig-input { width: 100%; max-width: 34rem; padding: .5rem .6rem; border: 1px solid var(--rule);
204 border-radius: 8px; background: transparent; color: var(--ink); font-size: .95rem; }
205 .mig-state { margin-top: .9rem; }
206 .mig-report code { word-break: break-all; font-size: .88rem; }
207 .mig-warn { color: var(--accent); }
208 .mig-report { border-left: 3px solid var(--accent); padding: .8rem 1rem; margin-bottom: 1.2rem;
209 background: color-mix(in srgb, var(--ink, #000) 4%, transparent); border-radius: 0 8px 8px 0; }
210 .mig-report.is-done { border-left-color: #3fa843; }
211 .mig-report h3 { margin: 0 0 .3rem; font-size: 1rem; }
212 .mig-warnlist { margin: .5rem 0; padding-left: 1.2rem; color: var(--accent); font-size: .9rem; }
213 .mig-confirm { margin-top: .9rem; padding-top: .9rem; border-top: 1px solid var(--rule); }
214</style>
Note: See TracBrowser for help on using the repository browser.