70 lines
2.9 KiB
Markdown
70 lines
2.9 KiB
Markdown
# 🍼 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`.
|