Changeset 41de7cb in Klonkt


Ignore:
Timestamp:
08/10/2026 04:13:24 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
21ef238
Parents:
f0a33e1
Message:

Een kopje draagt ook het nieuwste bericht VAN de ander

Op het toestel gezien: de hemel noemde mensen opeens 'boiert' en
'hotelbreakfast' in plaats van hun naam, en tekende letters in plaats van
gezichten. Oorzaak: is het nieuwste bericht in een gesprek van MIJ, dan draagt
het kopje mijn byline, en de hemel zoekt naam en gezicht van de ander in een
bericht VAN de ander. Vond hij dat niet, dan viel hij terug op het staartje van
de actor-uri.

conversationHeads geeft nu twee rijen per persoon: het nieuwste bericht (dat
bepaalt waar iemand hangt) en het nieuwste bericht van hem. Vallen ze samen,
dan blijft het een rij. Geen clientwijziging nodig -- conversationsFrom maakt er
dezelfde Conversation van.

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

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    rf0a33e1 r41de7cb  
    42664266export function conversationHeads(slug) {
    42674267  try {
     4268    // Twee rijen per persoon, niet een: het nieuwste bericht (dat bepaalt waar
     4269    // iemand in de hemel hangt) EN het nieuwste bericht VAN HEM.
     4270    //
     4271    // Die tweede is er omdat het nieuwste bericht van jou kan zijn, en dan
     4272    // draagt het jouw byline. De hemel zoekt de naam en het gezicht van de
     4273    // ander in een bericht van de ander -- vond hij dat niet, dan viel hij
     4274    // terug op het staartje van de actor-uri en heette tante opeens
     4275    // 'hotelbreakfast'. Op het toestel gezien, 10-8.
     4276    //
     4277    // Valt het samen (het nieuwste is al van hem), dan is het een rij; dubbel
     4278    // sturen doen we niet.
    42684279    return db.prepare(`
    42694280      SELECT other, stamp, direction, ref FROM (
    42704281        SELECT *, ROW_NUMBER() OVER (PARTITION BY other ORDER BY stamp DESC, ref DESC) AS rn
    42714282          FROM (${CONVERSATION_UNION})
     4283      ) WHERE rn = 1
     4284      UNION
     4285      SELECT other, stamp, direction, ref FROM (
     4286        SELECT *, ROW_NUMBER() OVER (PARTITION BY other ORDER BY stamp DESC, ref DESC) AS rn
     4287          FROM (${CONVERSATION_UNION}) WHERE direction = 'in'
    42724288      ) WHERE rn = 1
    42734289      ORDER BY stamp DESC, ref DESC`).all({ slug });
  • test/conversations.test.js

    rf0a33e1 r41de7cb  
    5050test('een rij per tegenpartij, hoe druk de drukste ook is', () => {
    5151  const heads = AP.conversationHeads('kind');
    52   assert.deepEqual(heads.map((k) => k.other), [OMA, TANTE], 'nieuwste gesprek eerst, allebei aanwezig');
     52  assert.deepEqual([...new Set(heads.map((k) => k.other))], [OMA, TANTE], 'nieuwste gesprek eerst, allebei aanwezig');
     53});
     54
     55test('is het nieuwste bericht van MIJ, dan gaat dat van hem ook mee', () => {
     56  // Anders draagt het kopje mijn byline en zoekt de hemel de naam en het
     57  // gezicht van de ander tevergeefs -- die viel dan terug op het staartje van
     58  // de actor-uri. Bij tante is mijn antwoord het nieuwste.
     59  const vanTante = AP.conversationHeads('kind').filter((k) => k.other === TANTE);
     60  assert.equal(vanTante.length, 2);
     61  assert.deepEqual(vanTante.map((k) => k.direction).sort(), ['in', 'out']);
     62  // Bij oma is het nieuwste al van haar: dan is een rij genoeg.
     63  assert.equal(AP.conversationHeads('kind').filter((k) => k.other === OMA).length, 1);
    5364});
    5465
     
    110121  const list = await get(`${slug}/conversations`);
    111122  assert.equal(list.status, 200);
    112   assert.equal(list.body.totalItems, 2, 'oma en tante, en niet de publieke vreemde');
     123  // Drie items voor twee mensen: bij tante gaat haar eigen bericht mee omdat
     124  // het nieuwste van mij is (anders mist de hemel haar naam en gezicht).
     125  assert.equal(list.body.totalItems, 3);
     126  assert.ok(!JSON.stringify(list.body).includes(VREEMDE), 'de publieke vreemde is geen gesprek');
     127  const vanTante = list.body.orderedItems.filter((i) => i.actor === TANTE);
     128  assert.equal(vanTante.length, 1, 'en dat bericht van tante draagt haar byline');
     129  assert.ok(vanTante[0].object.attributedTo.name);
    113130  // De byline zit in de ingesloten actor, net als overal sinds shaer-nmw.
    114131  assert.ok(list.body.orderedItems.every((i) => i.object.attributedTo));
Note: See TracChangeset for help on using the changeset viewer.