Ignore:
Timestamp:
07/31/2026 06:02:01 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
72ec6a4
Parents:
0ca7e9a4
Message:

Account-verhuizingen slice 3: het wegwijsbord (movedTo + homepage-link)

Het sluitstuk van shaer-0j2's federatiekant. De oude Klonkt blijft
staan en ZEGT waar hij heen ging, op twee plekken.

Voor servers: het actor-document draagt movedTo zodra moved_to gezet is
(FEP-7628: een verhuisd account moet dat publiceren en geldt als
inactief). Dat is precies waarom de oude actor online blijft: wie de
Move-activity miste (server offline, latere bezoeker) leert de
verhuizing alsnog door ons op te halen. Een kolomwaarde die geen URL is
haalt de draad nooit.

Voor mensen: de homepage opent met een groot wegwijsbord boven de feed,
met de handle van het nieuwe adres als grote link. Boven de posts met
opzet: niemand hoort een dode tijdlijn door te scrollen om te ontdekken
dat we weg zijn.

En de verhuizing zelf vertelt het nu twee keer: naast de Move gaat er
een Update van de actor naar elke volger-inbox, gebouwd uit de VERSE
rij, zodat het bord ook staat als de Move onderweg verdwijnt (FEP-7628
SHOULD).

Changed files:
src/services/ActivityPubService.js

  • buildActor: movedTo bij een geldige moved_to
  • moveAccount: Update(actor) naast de Move, per inbox

src/routes/posts.js

  • home: movedTo + leesbaar label (actorDisplay) naar de view

src/views/pages/home.ejs

  • wegwijsbord boven de feed, typeof-guard voor deploy-races

src/assets/css/style.css

  • .moved-banner: accentrand, grote link, tekst breekt netjes af

src/services/i18n.js

  • phome.moved_lead/_hint in nl/en/de

test/move-actor.test.js

  • movedTo aan/uit/rommel; Update draagt het bord naast de Move
  • slice-2-test telt nu Moves apart (Update rijdt mee)

remarks: banner visueel gecontroleerd (mobiel en desktop) door het echte
templateblok met de echte CSS te renderen; suite 372 groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r0ca7e9a4 rbfa6fa1  
    234234    }
    235235  } catch { /* skip malformed ap_aliases */ }
     236  // FEP-7628 slice 3: this account moved. The old actor stays online AS A
     237  // SIGNPOST — that is the whole point of keeping it: whoever missed the Move
     238  // activity (offline server, later visitor) still learns where we went by
     239  // fetching us. Per the FEP the moved actor "should be considered inactive",
     240  // and publishers should stop delivering here.
     241  if (site.moved_to && /^https?:\/\//i.test(String(site.moved_to))) actor.movedTo = String(site.moved_to);
    236242  // Profile links → PropertyValue rows: Mastodon/PeerTube/WordPress-ActivityPub render these as
    237243  // profile metadata (rel=me enables link-back verification). Additive; ignored by simpler receivers.
     
    38923898    to: [`${me}/followers`],
    38933899  };
     3900  // FEP-7628: after setting movedTo, notify the followers with an Update of
     3901  // the actor, so their servers hold the signpost even if the Move itself is
     3902  // lost. Built from the FRESH row: `site` still carries the pre-move values.
     3903  const movedSite = db.prepare('SELECT * FROM sites WHERE slug = ?').get(site.slug) || { ...site, moved_to: target.id };
     3904  const update = {
     3905    '@context': AP_CONTEXT,
     3906    id: `${me}#update-${Date.now()}-${rid()}`,
     3907    type: 'Update', actor: me, to: [PUBLIC], cc: [`${me}/followers`],
     3908    object: buildActor(base, movedSite),
     3909    published: new Date().toISOString(),
     3910  };
    38943911  const inboxes = [...new Set(fStmts().list.all(site.slug).map((f) => f.shared_inbox || f.inbox).filter(Boolean))];
     3912  const send = deliverFn || deliverWithRetry;
    38953913  for (const inbox of inboxes) {
    3896     await (deliverFn || deliverWithRetry)(site.slug, inbox, move, `${me}#main-key`, keys.private_pem);
     3914    await send(site.slug, inbox, update, `${me}#main-key`, keys.private_pem);
     3915    await send(site.slug, inbox, move, `${me}#main-key`, keys.private_pem);
    38973916  }
    38983917  console.log('[AP] MOVE announced:', site.slug, '→', target.id, 'naar', inboxes.length, 'inbox(en)');
Note: See TracChangeset for help on using the changeset viewer.