naissance-jerry/README.md

71 lines
2.9 KiB
Markdown
Raw Normal View History

2026-10-14 21:18:47 +02:00
# 🍼 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`.