feat #64 : onglet Statistiques — pages, livres, répartition AS #65

Merged
cedricAbonnel merged 2 commits from feat/books into main 2026-05-14 22:50:48 +00:00
Owner

Résumé

  • src/AccessLogParser.php : parse COMBINED, hits par /post/ et /book/, cache 10 min, glob + .gz + .tar.gz
  • src/AsnLookup.php : lookup ip-api.com batch (100 IPs/req), cache 30j, aggregateByAs(), applyGroups()
  • Onglet Statistiques dans l'admin (/admin/stats) : top pages, top livres, répartition réseau
  • Filtrage par groupe AS via badges (URL ?group=...)
  • Formulaire de configuration des groupes dans le même onglet (action admin_save_as_groups)
  • IPs privées (LAN) détectées et exclues du lookup API

Test

  • /admin/stats s'affiche sans erreur
  • Top pages liste les articles les plus vus
  • Livres listés si des accès /book/ existent dans les logs
  • Ajouter un groupe (ex : "Robots" + patterns "Google", "Bing") → badge filtre fonctionnel
  • Sur serveur avec IPs publiques : répartition AS affichée avec noms de réseaux

Ferme #64

🤖 Generated with Claude Code

## Résumé - `src/AccessLogParser.php` : parse COMBINED, hits par `/post/` et `/book/`, cache 10 min, glob + `.gz` + `.tar.gz` - `src/AsnLookup.php` : lookup ip-api.com batch (100 IPs/req), cache 30j, `aggregateByAs()`, `applyGroups()` - Onglet **Statistiques** dans l'admin (`/admin/stats`) : top pages, top livres, répartition réseau - Filtrage par groupe AS via badges (URL `?group=...`) - Formulaire de configuration des groupes dans le même onglet (action `admin_save_as_groups`) - IPs privées (LAN) détectées et exclues du lookup API ## Test - [ ] `/admin/stats` s'affiche sans erreur - [ ] Top pages liste les articles les plus vus - [ ] Livres listés si des accès `/book/` existent dans les logs - [ ] Ajouter un groupe (ex : "Robots" + patterns "Google", "Bing") → badge filtre fonctionnel - [ ] Sur serveur avec IPs publiques : répartition AS affichée avec noms de réseaux Ferme #64 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cedricAbonnel added 9 commits 2026-05-14 22:49:55 +00:00
file_put_contents() échouait silencieusement (permissions), provoquant
un saved=1 trompeur. Les deux fonctions retournent maintenant bool ;
les callers redirigent vers ?error=write et le template affiche un
message d'erreur explicite.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Crée les dossiers requis, applique setgid sur data/ et _cache/ pour
que les fichiers héritent du groupe web (www-data) quelle que soit
leur origine (PHP ou rsync), installe les dépendances et lance les
migrations SQL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute apacheAccessLog() dans SiteSettings — priorité au réglage admin,
fallback sur APACHE_ACCESS_LOG dans .env. Champ ajouté dans le formulaire
Site de l'administration.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- logFiles() utilise glob() au lieu d'un range fixe 1-14
- Support .tar.gz via PharData
- Champ apache_access_log déplacé du tab Site vers un bloc dédié
  dans le tab Recherches (action admin_save_searches_config)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Balaye tous les fichiers correspondant au pattern (ex: *-access.log)
et leurs rotations .gz/.tar.gz. Valeur par défaut : *-access.log.
Label renommé en "Pattern des logs d'accès".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute un concept de "livre" (série de pages ordonnées) avec :
- BookManager : CRUD JSON dans data/books/<slug>.json
- Route /book/<slug> → page de sommaire (table des matières)
- Navigation chapitre ← → en bas de chaque article membre du livre
- Bandeau "Chapitre X/N — Nom du livre" en haut de l'article
- Admin → onglet Livres : créer, éditer, supprimer un livre, ajouter/ordonner les pages via textarea slug

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- AccessLogParser : parse COMBINED, agrège hits /post/ et /book/, cache 10 min
- AsnLookup : batch lookup ip-api.com, cache 30j, agrégation et groupes AS
- Onglet Statistiques dans l'admin : top pages, top livres, répartition réseau
- Filtrage par groupe AS (badges) + formulaire de configuration des groupes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cedricAbonnel merged commit 8be56bc27f into main 2026-05-14 22:50:48 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#65