Changeset 5e16b8a in Klonkt


Ignore:
Timestamp:
08/15/2026 07:33:20 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
e1da6a1
Parents:
732272a
Message:

AP: eerste pagina serveren op elke collectie die first belooft

/ap/users/dev/library gaf 200 met first en last, maar ?page=1 gaf de
bibliotheek opnieuw: zelfde id, type Library, first weer naar zichzelf.
open.audio volgde die verwijzing bij "search a remote object" en gaf een
500 op onze URL terug.

pagedCollection kon dit al; vier routes gaven ?page= door en vier niet
(featured, tracks, playlists, library, library/followers). De bouwers
nemen nu een page aan en de routes reiken paginaNr(req) aan.

De test loopt over HTTP en in een lus over alle collecties. Over HTTP
omdat de unit-test op buildLibrary er al stond en groen was terwijl het
gat openstond -- het zat in de doorgifte, niet in de bouwer. In een lus
omdat het gat juist ontstond doordat de helft van de routes het wel had:
een rijtje losse gevallen vraagt om dezelfde vergeetachtigheid. Hij vond
meteen featured, die ik in deze ronde ook was vergeten.

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

Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r732272a r5e16b8a  
    11151115     ORDER BY pinned DESC, COALESCE(published_at, created_at) ASC LIMIT 20`
    11161116  ).all(site.id);
    1117   AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts));
     1117  AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts, { page: paginaNr(req) }));
    11181118});
    11191119
     
    11301130  const site = publicSite(req.params.slug);
    11311131  if (!site) return res.status(404).end();
    1132   AP.sendAP(res, AP.listPlaylistsAP(baseUrl(req), site, wantsEnriched(req, res)));
     1132  AP.sendAP(res, AP.listPlaylistsAP(baseUrl(req), site, wantsEnriched(req, res), { page: paginaNr(req) }));
    11331133});
    11341134
     
    11391139  const site = publicSite(req.params.slug);
    11401140  if (!site) return res.status(404).end();
    1141   AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id, { alles: await magAlles(req, site.slug) })));
     1141  AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id, { alles: await magAlles(req, site.slug) }), { page: paginaNr(req) }));
    11421142});
    11431143
     
    11501150// Openbaar, want alles erin is fedi_open. Er valt dus niets goed te keuren en de
    11511151// volgerslijst blijft leeg: wie ons volgt volgt de ACTOR, niet de bak.
     1152//
     1153// `?page=` MOET hier doorgegeven worden. Zonder dat adverteert de wortel een
     1154// `first` die op zichzelf uitkomt: de lezer volgt hem, krijgt weer een `Library`
     1155// in plaats van een pagina, en klapt eruit -- open.audio gaf op 15-8 een 500 op
     1156// precies deze URL. Dezelfde les als bij de outbox (shaer-sk4): een `first`
     1157// beloven is een pagina beloven.
    11521158router.get('/ap/users/:slug/library', (req, res) => {
    11531159  const site = publicSite(req.params.slug);
    11541160  if (!site) return res.status(404).end();
    1155   AP.sendAP(res, AP.buildLibrary(baseUrl(req), site, AP.siteOpenTracks(site.id)));
     1161  AP.sendAP(res, AP.buildLibrary(baseUrl(req), site, AP.siteOpenTracks(site.id), { page: paginaNr(req) }));
    11561162});
    11571163
     
    11611167  const site = publicSite(req.params.slug);
    11621168  if (!site) return res.status(404).end();
    1163   AP.sendAP(res, AP.pagedCollection(`${AP.libraryId(baseUrl(req), site)}/followers`, []));
     1169  AP.sendAP(res, AP.pagedCollection(`${AP.libraryId(baseUrl(req), site)}/followers`, [], { page: paginaNr(req) }));
    11641170});
    11651171
  • src/services/ActivityPubService.js

    r732272a r5e16b8a  
    12001200// these as the "Featured" tab (pinned to the profile). Posts come ordered by pin
    12011201// rank; embedded as full Notes so a remote server doesn't need extra fetches.
    1202 export function buildFeatured(base, site, posts) {
     1202export function buildFeatured(base, site, posts, { page = false } = {}) {
    12031203  const id = `${actorId(base, site.slug)}/featured`;
    12041204  const items = (posts || []).map((p) => buildNote(base, site, p));
    1205   return pagedCollection(id, items);
     1205  return pagedCollection(id, items, { page });
    12061206}
    12071207
  • src/services/music/index.js

    r732272a r5e16b8a  
    247247 * ooit een besloten variant, dan hoort daar het Follow/Accept-werk bij.
    248248 */
    249 export function buildLibrary(base, site, rows) {
     249export function buildLibrary(base, site, rows, { page = false } = {}) {
    250250  const id = libraryId(base, site);
    251251  const hostPosts = site.id ? trackHostPosts(site.id) : null;
    252252  const items = (rows || []).map((r) => buildTrackAudio(base, site, r, { hostPosts }));
    253253  return pagedCollection(id, items, {
     254    page,
    254255    extra: {
    255256      type: 'Library',
     
    265266
    266267/** De collectie van alle open tracks van een site (shaer-0nh, stap 3). */
    267 export function buildTrackCollection(base, site, rows) {
     268export function buildTrackCollection(base, site, rows, { page = false } = {}) {
    268269  // Eén zoekopdracht voor alle rijen samen; zie trackHostPosts.
    269270  const posts = site.id ? trackHostPosts(site.id) : null;
    270271  const items = (rows || []).map((r) => buildTrackAudio(base, site, r, { hostPosts: posts }));
    271   return pagedCollection(`${actorId(base, site.slug)}/tracks`, items, { extra: { attributedTo: actorId(base, site.slug) } });
     272  return pagedCollection(`${actorId(base, site.slug)}/tracks`, items, { page, extra: { attributedTo: actorId(base, site.slug) } });
    272273}
    273274
     
    314315// collectie zelf, want ook een lijst mag niet verklappen wat er achter de
    315316// poort staat.
    316 export function listPlaylistsAP(base, site, enriched) {
     317export function listPlaylistsAP(base, site, enriched, { page = false } = {}) {
    317318  const rows = db.prepare(
    318319    'SELECT id, title, artist, year, cover_url FROM playlists WHERE site_id = ? ORDER BY created_at, id'
     
    327328    return stub;
    328329  });
    329   return pagedCollection(colId, items, { extra: { attributedTo: actorId(base, site.slug) } });
     330  return pagedCollection(colId, items, { page, extra: { attributedTo: actorId(base, site.slug) } });
    330331}
    331332
Note: See TracChangeset for help on using the changeset viewer.