Changeset 383e897 in Klonkt
- Timestamp:
- 08/10/2026 06:16:16 PM (4 weeks ago)
- Branches:
- main
- Children:
- fc9ca9d
- Parents:
- e215090
- Files:
-
- 3 edited
-
src/routes/activitypub.js (modified) (1 diff)
-
src/services/ActivityPubService.js (modified) (2 diffs)
-
test/unread.test.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
re215090 r383e897 562 562 // dezelfde categorie als shaer:liked. Niet in totalItems persen: dat betekent 563 563 // '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 }); 565 568 const gezien = new Set(); 566 569 for (const { head, item } of pairs) { -
src/services/ActivityPubService.js
re215090 r383e897 4410 4410 * Eigen berichten tellen nooit mee: je hebt jezelf gelezen. 4411 4411 */ 4412 export function unreadPerConversation(slug) { 4413 try { 4412 export 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. 4414 4418 const rijen = db.prepare(` 4415 4419 SELECT u.other AS other, … … 4421 4425 WHERE u.direction = 'in' 4422 4426 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]) }); 4424 4430 return new Map(rijen.map((r) => [r.other, { n: r.n, wave: !!r.wave }])); 4425 4431 } catch { return new Map(); } -
test/unread.test.js
re215090 r383e897 71 71 assert.equal(AP.markRead('kind', 'https://elders/n/bestaat-niet'), null); 72 72 }); 73 74 test('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.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)