Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ArchiveImportService.js

    ra4fea5e re9ec5e4  
    2525import db from '../config/database.js';
    2626import { MEDIA_ROOT } from '../config/paths.js';
    27 import { FORMAT_VERSION } from './ArchiveExportService.js';
     27import { FORMAT_VERSION, parseFollowingCsv } from './ArchiveExportService.js';
    2828
    2929const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest('hex');
     
    116116function bestemming(a) {
    117117  return padVanOrigineel(a && a['shaer:originalUrl']) || `/media/archief/${path.basename(String((a && a.url) || ''))}`;
     118}
     119
     120/**
     121 * Volg opnieuw wie je volgde, uit de `following.csv` van een archief.
     122 *
     123 * BEWUST BUITEN importArchive. Die draait in één transactie en raakt alleen de
     124 * database; opnieuw volgen stuurt Follow-activiteiten de deur uit en wacht op
     125 * het netwerk. Dat hoort niet in een transactie: een trage peer houdt hem open,
     126 * en een rollback neemt verzonden activiteiten niet terug.
     127 *
     128 * Ook een aparte, expliciete stap omdat een archief inlezen stil is maar negen
     129 * mensen aanschrijven niet. Dat mag geen bijwerking zijn van een import.
     130 *
     131 * `followFn` is injecteerbaar, zodat de test geen netwerk raakt en dit bestand
     132 * ActivityPubService niet hoeft te importeren.
     133 */
     134export async function importFollowing(site, csvText, { followFn = null } = {}) {
     135  const rijen = parseFollowingCsv(csvText);
     136  const rapport = { totaal: rijen.length, gevolgd: 0, overgeslagen: 0, mislukt: [] };
     137  if (!followFn) return { ...rapport, error: 'no_follow_fn' };
     138  for (const r of rijen) {
     139    // Jezelf volgen is geen relatie maar een lus. Kan echt gebeuren bij een
     140    // archief van een instance die je onder een nieuwe naam opnieuw opzet.
     141    if (site && site.slug && r.address.startsWith(`${site.slug}@`)) { rapport.overgeslagen += 1; continue; }
     142    try {
     143      // De uitgelicht-stand gaat MEE in de Follow zelf: followActor neemt hem
     144      // als derde argument en zet auto_boost bij het aanmaken van de rij. Een
     145      // aparte UPDATE erna zou een tweede pad zijn naar dezelfde vlag, en dan
     146      // kan er precies een halve toestand ontstaan als die faalt.
     147      const ok = await followFn(site, r.address, r.featured);
     148      if (ok === false) { rapport.mislukt.push({ adres: r.address, reden: 'geweigerd' }); continue; }
     149      rapport.gevolgd += 1;
     150    } catch (e) {
     151      rapport.mislukt.push({ adres: r.address, reden: (e && e.message) || 'onbekend' });
     152    }
     153  }
     154  return rapport;
    118155}
    119156
Note: See TracChangeset for help on using the changeset viewer.