Changeset 67f7150 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
07/30/2026 11:26:35 AM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
6dd26e5
Parents:
a9da2c0
Message:

C2S Delete voor eigen notes en shaer:author op de eigen outbox

Twee dingen uit de app (Robins verzoek, 30-7). Een: long-press delete op
een eigen post. De C2S outbox accepteert nu Delete voor notes van dit
account: eigen posts (Tombstone naar volgers, dan cascade zoals de
web-route) en eigen outbound replies (via deliverOutboxDelete). Andermans
posts en onbekende notes krijgen een helder 403/404.

Twee: eigen posts hadden in de app geen header. De timeline-entries
dragen shaer:author, maar de eigen outbox-leg niet, dus elke kaart had
een byline behalve je eigen. De outbox zet nu op de friend-leg de eigen
display-info (titel, handle, avatar) als shaer:author op elke note.

Changed files:
src/services/ActivityPubService.js

  • case 'Delete' in ingestOutboxActivity: eigen post -> deliverDelete + cascade (comments, FTS, post); eigen outbox-reply -> tombstone; vreemd -> 403/404
  • selfAuthor(base, site): eigen byline in shaer:author-vorm

src/routes/activitypub.js

  • outbox friend-leg verrijkt elke note met shaer:author

test/c2s-compose.test.js

  • delete-test (eigen wel, andermans niet, onbekend 404) en selfAuthor-test

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    ra9da2c0 r67f7150  
    110110     ORDER BY COALESCE(published_at, created_at) DESC LIMIT 20`
    111111  ).all(site.id);
    112   AP.sendAP(res, AP.buildOutbox(baseUrl(req), site, posts), audience === 'friend' ? 'private, no-store' : undefined);
     112  const ob = AP.buildOutbox(baseUrl(req), site, posts);
     113  if (audience === 'friend') {
     114    // The owner's app builds its feed from this leg, and every note here is
     115    // by the site itself: give it the same `shaer:author` byline the timeline
     116    // entries carry, so your own cards get a header too (avatar + name).
     117    const me = AP.selfAuthor(baseUrl(req), site);
     118    for (const it of ob.orderedItems) {
     119      if (it && it.object && typeof it.object === 'object') it.object['shaer:author'] = me;
     120    }
     121  }
     122  AP.sendAP(res, ob, audience === 'friend' ? 'private, no-store' : undefined);
    113123});
    114124
Note: See TracChangeset for help on using the changeset viewer.