Stats : timeline du trafic (courbe jour/heure) globale et par contenu #93

Open
opened 2026-05-16 09:04:15 +00:00 by cedricAbonnel · 0 comments
Owner

Contexte

La page /admin/stats affiche des totaux sur 14 jours (hits par réseau, par livre, par article). On n'a aucune vision de l'évolution dans le temps : impossible de détecter un pic de trafic, une date de publication qui génère un afflux, ou un scraping intensif sur une période courte.

Ce qu'on veut

Vue globale

Un graphique en barres (CSS ou canvas léger) montrant le trafic jour par jour sur les 14 derniers jours — courbe unique, tous contenus confondus.

Vue par contenu (optionnel, 2e itération)

En cliquant sur un article ou un livre dans les stats, afficher sa propre courbe de trafic sur la période.

Vue par réseau / pays (complément du ticket #92)

Une fois le ticket #92 implémenté, chaque réseau et chaque pays pourrait avoir sa propre timeline dépliable.

Données disponibles

  • AccessLogParser::parseTimestamp() est déjà là et retourne un int Unix — il est utilisé uniquement pour filtrer par cutoff, le résultat est jeté ensuite.
  • parseLine() a déjà $ts en main : il suffit de le conserver pour le grouper par jour (date('Y-m-d', $ts)) ou par heure.
  • Aucune lib externe nécessaire : barres CSS proportionnelles suffisent (même pattern que les progress bars déjà utilisées dans les tableaux stats).

Travail technique

  1. AccessLogParser : ajouter une méthode timeline(string $granularity = 'day'): array retournant [date => hits] (tous contenus) et timelineByPath(string $prefix): array pour filtrer par /post/… ou /book/….
  2. Backend : alimenter $adminData['stats_timeline'] (tableau [date => hits] des 14 derniers jours) dans l'action stats.
  3. Template : section "Trafic quotidien" avec barres CSS proportionnelles, étiquettes de date en abscisse, tooltip au survol avec le nombre exact de hits.
  4. Cache : inclure la timeline dans le cache stats existant (TTL 10 min).

Maquette

Trafic quotidien (14 derniers jours)
─────────────────────────────────────────────────
  120 ┤
   80 ┤  ██
   40 ┤  ██  ██        ██
    0 └──────────────────────────────────────────
       03/05 04/05 05/05 … 16/05
─────────────────────────────────────────────────

Critères d'acceptation

  • Courbe jour par jour visible sur la page /admin/stats
  • Les données couvrent exactement la même période que le reste des stats (14j par défaut, + filtre de période quand il sera ajouté)
  • Rendu lisible sur mobile
  • Données cachées avec le reste des stats

Lien

Complémentaire du ticket #92 (stats par réseau / pays / visiteur).

## Contexte La page `/admin/stats` affiche des totaux sur 14 jours (hits par réseau, par livre, par article). On n'a aucune vision de **l'évolution dans le temps** : impossible de détecter un pic de trafic, une date de publication qui génère un afflux, ou un scraping intensif sur une période courte. ## Ce qu'on veut ### Vue globale Un graphique en barres (CSS ou canvas léger) montrant le trafic jour par jour sur les 14 derniers jours — courbe unique, tous contenus confondus. ### Vue par contenu (optionnel, 2e itération) En cliquant sur un article ou un livre dans les stats, afficher sa propre courbe de trafic sur la période. ### Vue par réseau / pays (complément du ticket #92) Une fois le ticket #92 implémenté, chaque réseau et chaque pays pourrait avoir sa propre timeline dépliable. ## Données disponibles - `AccessLogParser::parseTimestamp()` est déjà là et retourne un `int` Unix — il est utilisé uniquement pour filtrer par cutoff, le résultat est jeté ensuite. - `parseLine()` a déjà `$ts` en main : il suffit de le conserver pour le grouper par jour (`date('Y-m-d', $ts)`) ou par heure. - Aucune lib externe nécessaire : barres CSS proportionnelles suffisent (même pattern que les progress bars déjà utilisées dans les tableaux stats). ## Travail technique 1. **`AccessLogParser`** : ajouter une méthode `timeline(string $granularity = 'day'): array` retournant `[date => hits]` (tous contenus) et `timelineByPath(string $prefix): array` pour filtrer par `/post/…` ou `/book/…`. 2. **Backend** : alimenter `$adminData['stats_timeline']` (tableau `[date => hits]` des 14 derniers jours) dans l'action stats. 3. **Template** : section "Trafic quotidien" avec barres CSS proportionnelles, étiquettes de date en abscisse, tooltip au survol avec le nombre exact de hits. 4. **Cache** : inclure la timeline dans le cache stats existant (TTL 10 min). ## Maquette ``` Trafic quotidien (14 derniers jours) ───────────────────────────────────────────────── 120 ┤ 80 ┤ ██ 40 ┤ ██ ██ ██ 0 └────────────────────────────────────────── 03/05 04/05 05/05 … 16/05 ───────────────────────────────────────────────── ``` ## Critères d'acceptation - [ ] Courbe jour par jour visible sur la page `/admin/stats` - [ ] Les données couvrent exactement la même période que le reste des stats (14j par défaut, + filtre de période quand il sera ajouté) - [ ] Rendu lisible sur mobile - [ ] Données cachées avec le reste des stats ## Lien Complémentaire du ticket #92 (stats par réseau / pays / visiteur).
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#93