Changeset 2b4252c in Klonkt for src/config


Ignore:
Timestamp:
07/25/2026 09:15:34 AM (7 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4f15f67
Parents:
af5b79b
Message:

Cross-instance follow-goedkeuring, gemodelleerd op de guardian-offer (§5.3)

Guardians die op een andere instance wonen kunnen nu een gated follow goedkeuren.
Zelfde gedistribueerde patroon als de adoptie-offer: de ward forwardt de follow
naar z'n guardians als een Offer(Follow); elke guardian houdt een kopie en ziet
'm in /guardian2; de guardian antwoordt met Accept/Reject naar de ward; de ward
telt quorum (bestaande follows.decide) en stuurt de gewone Accept(Follow) naar de
volger. Lokale guardians blijven zoals ze waren (push + lokale beslissing, geen
forwarding). Alles achter de shaer:followApproval-marker, dus normaal verkeer
onaangeroerd.

Changed files:
src/services/ActivityPubService.js

  • gate: remote guardian krijgt Offer(Follow) (leg 1); lokale guardian push
  • handleFollowApprovalInbox: Offer(Follow) -> review (leg 2), Accept/Reject -> decide+commit (leg 4)
  • sendFollowDecision: guardian stuurt beslissing naar de ward (leg 3)
  • dispatch-tak op shaer:followApproval vóór de handshake-dispatch

src/services/guardianship/follows.js

  • guardian-side review-store (recordReview/getReview/listReviews/removeReview)

src/config/database.js

  • ap_follow_reviews (PK slug,id): de guardian-kopie van een remote-ward-follow

src/routes/guardian2.js

  • follow-requests toont ook reviews (remote); approve op een review = sendFollowDecision

test/follow-gating.test.js

  • review-store test erbij

remarks: npm test 171/171. Spec-clausule §5.3 toegevoegd (forwarding gemodelleerd
op §3). Lokale/co-located flow ongewijzigd.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/config/database.js

    raf5b79b r2b4252c  
    7171    PRIMARY KEY (follow_id, guardian_uri)
    7272  )`);
     73  // Cross-instance follow-approval (modelled on the guardian offer): the
     74  // guardian-side COPY of a gated follow on a REMOTE ward, forwarded here by
     75  // the ward's server as an Offer(Follow). The decision is sent back to the
     76  // ward's inbox. (Local wards use ap_pending_follows directly.)
     77  db.exec(`CREATE TABLE IF NOT EXISTS ap_follow_reviews (
     78    id TEXT NOT NULL,
     79    guardian_slug TEXT NOT NULL,
     80    ward_uri TEXT NOT NULL,
     81    ward_inbox TEXT,
     82    follower_uri TEXT NOT NULL,
     83    follower_handle TEXT,
     84    follower_icon TEXT,
     85    follow_json TEXT,
     86    status TEXT DEFAULT 'pending',
     87    created_at TEXT DEFAULT CURRENT_TIMESTAMP,
     88    PRIMARY KEY (guardian_slug, id)
     89  )`);
    7390  ensureColumn('sites', 'profile_photo', 'TEXT');
    7491  ensureColumn('audio_tracks', 'cover_url', 'TEXT');
Note: See TracChangeset for help on using the changeset viewer.