Changeset 383e897 in Klonkt


Ignore:
Timestamp:
08/10/2026 06:16:16 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
fc9ca9d
Parents:
e215090
Message:

De badge telt niet wat de poort verbergt

Gevonden bij het bijwerken van de bead, niet bij het bouwen: unreadPerConversation
telde alle inkomende berichten, ook die de app achter een dichte messages-poort
nooit toont. Dan vertelt het getal precies wat de poort verbergt.

Nu dezelfde regel als bij de serialisatie: dicht telt niet mee, behalve wat er
altijd door mag -- het guardian-kanaal en de boei.

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

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    re215090 r383e897  
    562562  // dezelfde categorie als shaer:liked. Niet in totalItems persen: dat betekent
    563563  // 'hoeveel er zijn' en niet 'hoeveel jij nog niet zag'.
    564   const ongelezen = AP.unreadPerConversation(auth.site.slug);
     564  const ongelezen = AP.unreadPerConversation(auth.site.slug, {
     565    messagesAllowed: P.messagesAllowed,
     566    guardians: (() => { try { return new Set(Guardianship.listGuardians(auth.site.slug).map((g) => g.other_uri)); } catch { return new Set(); } })(),
     567  });
    565568  const gezien = new Set();
    566569  for (const { head, item } of pairs) {
  • src/services/ActivityPubService.js

    re215090 r383e897  
    44104410 * Eigen berichten tellen nooit mee: je hebt jezelf gelezen.
    44114411 */
    4412 export function unreadPerConversation(slug) {
    4413   try {
     4412export function unreadPerConversation(slug, { messagesAllowed = true, guardians = new Set() } = {}) {
     4413  try {
     4414    // DE POORT TELT MEE. Staat messages dicht, dan toont de app die berichten
     4415    // niet -- en dan mag een badge ze ook niet aankondigen, want dat getal
     4416    // vertelt precies wat de poort verbergt. Wat er altijd door mag telt wel:
     4417    // het guardian-kanaal en de boei. Zelfde regel als bij de serialisatie.
    44144418    const rijen = db.prepare(`
    44154419      SELECT u.other AS other,
     
    44214425       WHERE u.direction = 'in'
    44224426         AND (r.cursor IS NULL OR (u.stamp || '|' || u.ref) > r.cursor)
    4423        GROUP BY u.other`).all({ slug });
     4427         AND (@open = 1 OR m.help_request = 1 OR u.other IN (SELECT value FROM json_each(@guardians)))
     4428       GROUP BY u.other`)
     4429      .all({ slug, open: messagesAllowed ? 1 : 0, guardians: JSON.stringify([...guardians]) });
    44244430    return new Map(rijen.map((r) => [r.other, { n: r.n, wave: !!r.wave }]));
    44254431  } catch { return new Map(); }
  • test/unread.test.js

    re215090 r383e897  
    7171  assert.equal(AP.markRead('kind', 'https://elders/n/bestaat-niet'), null);
    7272});
     73
     74test('een dichte messages-poort telt niet mee wat hij verbergt', () => {
     75  // Anders vertelt het getal precies wat de poort verbergt: 'er zijn 3
     76  // berichten' terwijl de app er geen laat zien.
     77  const OPA = 'https://elders/u/opa';
     78  arrived('https://elders/n/opa1', OPA, '2026-08-02T10:00:00Z');
     79  arrived('https://elders/n/oom2', OOM, '2026-08-02T11:00:00Z');
     80  db.prepare(`INSERT INTO ap_mentions (slug, object_uri, actor_uri, actor_name, content, published, help_request)
     81              VALUES ('kind', 'https://elders/n/boei', ?, 'iemand', '<p>help</p>', '2026-08-02T12:00:00Z', 1)`).run(OPA);
     82
     83  const dicht = AP.unreadPerConversation('kind', { messagesAllowed: false, guardians: new Set([OOM]) });
     84  assert.equal(dicht.get(OPA).n, 1, 'alleen de boei van opa telt');
     85  assert.ok(dicht.get(OOM), 'het guardian-kanaal gaat altijd door');
     86
     87  const open = AP.unreadPerConversation('kind', { messagesAllowed: true });
     88  assert.equal(open.get(OPA).n, 2, 'met de poort open tellen ze allebei');
     89});
Note: See TracChangeset for help on using the changeset viewer.