naissance-jerry/README.md
2026-10-14 21:18:47 +02:00

70 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🍼 Naissance — les pronostics pour le bébé de Jerry
Petite application web pour parier sur l'arrivée du bébé : **jour, heure, sexe, poids, taille et prénom**.
- Connexion avec un compte Google (le prénom Google est affiché).
- Un pronostic par personne, que seul son auteur peut modifier ou supprimer, jusqu'à la clôture.
- Les pronostics restent secrets jusqu'à la naissance : chacun ne voit que le sien et le nombre de participants.
À partir de `STATS_MIN_PREDICTIONS` pronostics (5 par défaut), des tendances volontairement arrondies
s'affichent (plutôt fille/garçon, semaine, moment de la journée, poids à 100 g près, taille au cm près).
Les administrateurs voient en plus la liste des participants (sans leurs pronostics).
- Les administrateurs (`ADMIN_EMAILS`) fixent la date du terme, clôturent les pronostics, saisissent
les vraies informations à la naissance et peuvent supprimer un pronostic.
- Une fois le résultat saisi : classement automatique, podium et confettis 🎉.
## Barème (sur 100)
| Critère | Points | Calcul |
|---|---|---|
| Jour | 30 | −3 pts par jour d'écart |
| Heure | 15 | dégressif, 0 à 6 h d'écart (circulaire autour de minuit) |
| Sexe | 15 | tout ou rien |
| Poids | 15 | dégressif, 0 à 1 kg d'écart (−1,5 pt / 100 g) |
| Taille | 15 | dégressif, 0 à 8 cm d'écart |
| Prénom | 10 | exact (accents et majuscules ignorés) ; 3 pts si même initiale |
Égalité : le pronostic dont la dernière modification est la plus ancienne gagne.
Le barème se règle dans `src/scoring.js`.
## Configuration Google
1. Sur <https://console.cloud.google.com/> : créer un projet, configurer l'écran de consentement OAuth
(type « Externe », portées `openid`, `email`, `profile`), puis le **publier** pour que tout le monde puisse se connecter.
2. *Identifiants > Créer > ID client OAuth > Application Web*, avec comme URI de redirection autorisé :
`https://VOTRE-DOMAINE/auth/google/callback`
3. Copier `.env.example` en `.env` et le remplir.
## Déploiement (Docker)
```sh
cp .env.example .env # puis éditer
docker compose up -d --build
```
L'app écoute sur `127.0.0.1:3000` ; placez un reverse proxy HTTPS devant (Caddy, Nginx, Traefik…).
Exemple Caddy :
```
naissance.example.com {
reverse_proxy 127.0.0.1:3000
}
```
Les données (SQLite) sont dans le volume `naissance-data`. Sauvegarde :
`docker compose cp naissance:/data/naissance.db ./sauvegarde.db`
Sans Docker : Node.js ≥ 22.13, `npm ci --omit=dev`, puis `npm start` avec les variables d'environnement
(`DB_PATH` optionnel, `./data/naissance.db` par défaut).
## Développement
```sh
npm install
ADMIN_EMAILS=jerry@example.com npm run dev
```
`npm run dev` active `DEV_LOGIN` : sans identifiants Google, « Se connecter » crée un utilisateur de test.
Plusieurs comptes : `http://localhost:3000/auth/dev?name=Alice`, `…?name=Jerry&email=jerry@example.com`.
**Ne jamais activer `DEV_LOGIN` en production.**
Tests du barème : `npm test`.