Changeset 834bcc3 in Klonkt for src/services/StatsService.js


Ignore:
Timestamp:
06/23/2026 06:14:27 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
d774679
Parents:
bb42dfb
Message:

i18n: translate Dutch code comments to English across src/

Comments in routes/services/views/config/middleware/assets translated to
English for the public repo. A few dev-facing throw/console message strings
were Englished too. No user-facing UI strings or i18n dictionary values changed
(src/services/i18n.js untouched). Logic unchanged.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/StatsService.js

    rbb42dfb r834bcc3  
    1 // StatsService — cookievrije statistieken (premium-module).
     1// StatsService — cookie-free statistics (premium module).
    22//
    3 // Tellers: posts.view_count, audio_tracks.play_count, en per dag/site het aantal
    4 // pageviews (stat_daily) + unieke bezoekers (stat_visitor_day).
     3// Counters: posts.view_count, audio_tracks.play_count, and per day/site the number
     4// of pageviews (stat_daily) + unique visitors (stat_visitor_day).
    55//
    6 // Unieke bezoekers ZONDER cookie: een sha256 van IP+UA+dag-salt. De salt roteert
    7 // elke dag en wordt nooit langer bewaard → je kunt iemand niet over dagen heen
    8 // volgen, het ruwe IP wordt niet opgeslagen. Geen persistente identifier, geen
    9 // toestemmingsbanner nodig (Plausible/Fathom-aanpak).
     6// Unique visitors WITHOUT cookies: a sha256 of IP+UA+daily-salt. The salt rotates
     7// every day and is never stored longer → you cannot track someone across days,
     8// and the raw IP is never persisted. No persistent identifier, no consent
     9// banner required (Plausible/Fathom approach).
    1010
    1111import crypto from 'node:crypto';
     
    1717}
    1818
    19 // Dagelijks roterende salt (gecachet in proces, persistent in app_settings zodat
    20 // een herstart binnen dezelfde dag dezelfde salt houdt).
     19// Daily rotating salt (cached in process, persisted in app_settings so that
     20// a restart within the same day reuses the same salt).
    2121let _salt = null, _saltDay = null;
    2222function dailySalt() {
     
    3939}
    4040
    41 // De eigenaar/beheerder niet meetellen — anders inflate je je eigen cijfers.
     41// Don't count the owner/admin — otherwise you inflate your own numbers.
    4242function isOperator(req) {
    4343  const u = req && req.session && req.session.user;
     
    4545}
    4646
    47 // Bekende bots/crawlers + link-preview-fetchers + scripts overslaan, zodat ze de
    48 // weergaven/bezoeker-dagen niet opblazen. Geen UA = vrijwel altijd geautomatiseerd.
     47// Skip known bots/crawlers + link-preview fetchers + scripts so they don't inflate
     48// view/visitor-day counts. Empty UA = almost always automated.
    4949const BOT_RE = /bot|crawl|spider|slurp|mediapartners|bingpreview|facebookexternalhit|whatsapp|telegram|discord|twitter|linkedin|embedly|pinterest|redditbot|applebot|petalbot|yandex|baidu|duckduckbot|semrush|ahrefs|mj12|dotbot|uptimerobot|pingdom|statuscake|headless|lighthouse|gptbot|claude|ccbot|perplexity|bytespider|amazonbot|googleother|google-read-aloud|python-requests|scrapy|curl|wget|axios|node-fetch|go-http|java\/|okhttp|libwww|httpclient/i;
    5050function isBot(req) {
    5151  const ua = (req && req.headers && req.headers['user-agent']) || '';
    52   if (!ua) return true;          // lege UA = script/bot
     52  if (!ua) return true;          // empty UA = script/bot
    5353  return BOT_RE.test(ua);
    5454}
    5555
    56 // Lazy prepares — tabellen bestaan pas ná initializeDatabase(); dit module wordt
    57 // geïmporteerd vóór die call.
     56// Lazy prepares — tables only exist after initializeDatabase(); this module is
     57// imported before that call.
    5858let _s = null;
    5959function stmts() {
     
    7575}
    7676
    77 // Externe referrer-host uit de Referer-header (pro-stats #5). Lege/eigen-site/
    78 // ongeldige referrers worden overgeslagen → alleen echte externe bronnen tellen.
     77// External referrer host from the Referer header (pro stats #5). Empty/own-site/
     78// invalid referrers are skipped → only genuine external sources are counted.
    7979function recordReferrer(siteId, req) {
    8080  try {
     
    8484    if (!host) return;
    8585    const own = ((req.headers && req.headers.host) || '').replace(/^www\./, '').toLowerCase();
    86     if (host === own) return; // interne navigatie telt niet als bron
     86    if (host === own) return; // internal navigation does not count as a source
    8787    stmts().bumpReferrer.run(siteId, host.slice(0, 120));
    88   } catch { /* geen geldige referrer-URL → overslaan */ }
     88  } catch { /* not a valid referrer URL → skip */ }
    8989}
    9090
     
    9696    stmts().addVisitor.run(siteId, d, visitorHash(req));
    9797    recordReferrer(siteId, req);
    98   } catch { /* statistieken mogen nooit een request breken */ }
     98  } catch { /* stats must never break a request */ }
    9999}
    100100
     
    112112}
    113113
    114 // Instance-brede statistieken (solo = de site, hub = alle sites samen).
     114// Instance-wide statistics (solo = the site, hub = all sites combined).
    115115export function getStats(days = 14) {
    116116  days = [7, 14, 30, 90].includes(Number(days)) ? Number(days) : 14;
     
    129129  }
    130130  const totals = {
    131     pageviews: series.reduce((s, r) => s + r.pageviews, 0), // laatste N dagen
    132     visitors: series.reduce((s, r) => s + r.visitors, 0),   // som van dag-uniques (cookieless kan niet anders)
     131    pageviews: series.reduce((s, r) => s + r.pageviews, 0), // last N days
     132    visitors: series.reduce((s, r) => s + r.visitors, 0),   // sum of daily uniques (cookieless has no alternative)
    133133    plays: db.prepare('SELECT COALESCE(SUM(play_count), 0) AS n FROM audio_tracks').get().n,
    134134    postViews: db.prepare('SELECT COALESCE(SUM(view_count), 0) AS n FROM posts').get().n,
     
    142142    ORDER BY play_count DESC LIMIT 5
    143143  `).all();
    144   // Top externe bronnen (pro #5) — instance-breed geaggregeerd per host.
     144  // Top external sources (pro #5) — aggregated instance-wide per host.
    145145  let referrers = [];
    146146  try {
     
    149149    ).all();
    150150  } catch { referrers = []; }
    151   // All-time totalen (cookieloze unieke bezoekers = som van dag-uniques).
     151  // All-time totals (cookieless unique visitors = sum of daily uniques).
    152152  const allTime = {
    153153    pageviews: db.prepare('SELECT COALESCE(SUM(pageviews),0) AS n FROM stat_daily').get().n,
Note: See TracChangeset for help on using the changeset viewer.