Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    re5fc801 rd14bf1c  
    35023502 */
    35033503export function feedCursor(slug) {
    3504   const max = (sql, ...args) => { try { const r = db.prepare(sql).get(...args); return (r && r.n) || 0; } catch { return 0; } };
    3505   const t = max('SELECT MAX(rowid) AS n FROM ap_timeline WHERE slug = ?', slug);
    3506   const m = max('SELECT MAX(rowid) AS n FROM ap_mentions WHERE slug = ?', slug);
    3507   const o = max('SELECT MAX(rowid) AS n FROM ap_outbox WHERE site_slug = ?', slug);
    3508   const r = max(`SELECT MAX(i.rowid) AS n FROM ap_interactions i
    3509                    JOIN posts p ON p.id = i.post_id
    3510                    JOIN sites s ON s.id = p.site_id
    3511                   WHERE s.slug = ? AND i.kind = 'reply'`, slug);
    3512   return `${t}.${m}.${o}.${r}`;
     3504  try {
     3505    const r = db.prepare('SELECT MAX(rev) AS n FROM ap_feed_state WHERE slug = ?').get(slug);
     3506    return String((r && r.n) || 0);
     3507  } catch { return '0'; }
     3508}
     3509
     3510/**
     3511 * Wat er sinds `rev` met deze tijdlijn gebeurd is: welke berichten er nieuw zijn,
     3512 * bewerkt, of weg.
     3513 *
     3514 * Nog niet gebruikt door een leespad -- de vorm van de aankomst is shaer-of7 en
     3515 * de "bewerkt"-markering is daar nog een open beslissing. Maar de gegevens
     3516 * ontstaan hoe dan ook bij het bijhouden van de merksteen, en dit is de enige
     3517 * plek waar ze samen te lezen zijn.
     3518 */
     3519export function feedChangesSince(slug, rev, limit = 200) {
     3520  try {
     3521    return db.prepare(`SELECT object_uri, kind, rev FROM ap_feed_state
     3522                        WHERE slug = ? AND rev > ? ORDER BY rev ASC LIMIT ?`)
     3523      .all(slug, parseInt(rev, 10) || 0, limit);
     3524  } catch { return []; }
    35133525}
    35143526
     
    52785290  // Guardian PWA / Berichten push. The kid answers an incoming offer in its
    52795291  // own Berichten; an existing guardian and a commit land in the PWA.
    5280   //
    5281   // De labels hangen aan dezelfde sleutels als het Guardian-paneel, zodat een
    5282   // melding en het scherm waar hij heen wijst hetzelfde woord gebruiken.
    52835292  onEvent: (slug, ev) => {
    5284     const p = guardianEventPush(slug, ev);
    5285     if (p) pushEvent(slug, p);
     5293    const L = pushLang(slug);
     5294    const texts = {
     5295      offer_received: ['push.n_guard_offer_t', 'push.n_guard_offer_b'],   // I am the ward
     5296      offer_for_ward: ['push.n_guard_cog_t', 'push.n_guard_cog_b'],       // I co-guard this ward
     5297      committed: ['push.n_guard_ward_t', 'push.n_guard_ward_b'],
     5298      // §3.2: a guardian ended the relation. The ward hears that someone who
     5299      // was looking after them has gone; a co-guardian hears they are one fewer.
     5300      guardian_left: ['push.n_guard_left_t', 'push.n_guard_left_b'],
     5301      coguardian_left: ['push.n_guard_cogleft_t', 'push.n_guard_cogleft_b'],
     5302    }[ev.kind];
     5303    if (!texts) return;
     5304    const who = deriveHandle(ev.candidate || ev.guardian || ev.ward || '') || '?';
     5305    const url = (ev.kind === 'offer_received' || ev.kind === 'guardian_left') ? `${pushPrefix(slug)}/messages` : '/guardian';
     5306    pushEvent(slug, { type: 'guardian', title: i18nT(L, texts[0]), body: i18nT(L, texts[1], { who }), url });
    52865307  },
    52875308});
    5288 
    5289 /**
    5290  * Welke melding hoort bij een guardianship-gebeurtenis, of geen.
    5291  *
    5292  * Apart en puur, omdat dit een BESLISSING is en geen bezorging: de
    5293  * guardianship-module zendt veertien soorten uit en deze tabel bepaalt welke
    5294  * daarvan een mens wakker maken. Dat hoort toetsbaar te zijn zonder web-push
    5295  * erbij te halen.
    5296  */
    5297 export function guardianEventPush(slug, ev) {
    5298   const L = pushLang(slug);
    5299   const texts = {
    5300     offer_received: ['push.n_guard_offer_t', 'push.n_guard_offer_b'],   // I am the ward
    5301     offer_for_ward: ['push.n_guard_cog_t', 'push.n_guard_cog_b'],       // I co-guard this ward
    5302     committed: ['push.n_guard_ward_t', 'push.n_guard_ward_b'],
    5303     // §3.2: a guardian ended the relation. The ward hears that someone who
    5304     // was looking after them has gone; a co-guardian hears they are one fewer.
    5305     guardian_left: ['push.n_guard_left_t', 'push.n_guard_left_b'],
    5306     coguardian_left: ['push.n_guard_cogleft_t', 'push.n_guard_cogleft_b'],
    5307     // 5.6 gated settings. Zonder deze twee is de hele tally stil: een guardian
    5308     // hoort niet dat er een antwoord van hem gewenst is, en dus loopt het
    5309     // venster leeg en verloopt het voorstel. Een drempel die niemand ziet is
    5310     // geen drempel.
    5311     gated_review: ['push.n_gate_ask_t', 'push.n_gate_ask_b'],      // jij moet antwoorden
    5312     gated_outcome: ['push.n_gate_done_t', 'push.n_gate_done_b'],   // er is besloten
    5313   }[ev.kind];
    5314   if (!texts) return null;
    5315   const who = deriveHandle(ev.candidate || ev.guardian || ev.ward || '') || '?';
    5316   // Een gate-melding zonder te zeggen WELKE instelling is nutteloos: er zijn er
    5317   // meer dan een, en ze betekenen heel verschillende dingen voor een kind.
    5318   const wat = i18nT(L, GATE_LABEL[ev.feature] || 'guardian.prop_embeds');
    5319   const stand = i18nT(L, ev.value ? 'guardian.prop_on' : 'guardian.prop_off');
    5320   const uitkomst = i18nT(L, GATE_OUTCOME[ev.outcome] || 'guardian.prop_st_open');
    5321   const url = (ev.kind === 'offer_received' || ev.kind === 'guardian_left') ? `${pushPrefix(slug)}/messages` : '/guardian';
    5322   return { type: 'guardian', title: i18nT(L, texts[0]), body: i18nT(L, texts[1], { who, wat, stand, uitkomst }), url };
    5323 }
    5324 
    5325 // Van een gated feature naar het woord dat het Guardian-paneel er al voor
    5326 // gebruikt. Een onbekende feature valt terug op het algemene woord in plaats van
    5327 // de melding te laten vervallen: liever een iets vager bericht dan geen bericht.
    5328 const GATE_LABEL = {
    5329   'shaer:externalEmbeds': 'guardian.prop_embeds',
    5330   'shaer:externalPlayback': 'guardian.prop_play',
    5331 };
    5332 const GATE_OUTCOME = {
    5333   accepted: 'guardian.prop_st_accepted',
    5334   rejected: 'guardian.prop_st_rejected',
    5335   expired: 'guardian.prop_st_expired',
    5336 };
    53375309
    53385310// The notification duty of FEP-633c 3.6.2, wired once for every place a
     
    53645336  buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFollowing, buildFeatured,
    53655337  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
    5366   feedCursor, waitForFeedChange,
     5338  feedCursor, feedChangesSince, waitForFeedChange,
    53675339  getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote,
    53685340  listOutbox, deliverOutboxDelete, deliverOutboxUpdate, deliverDirectNote,
Note: See TracChangeset for help on using the changeset viewer.