71 lines
2.9 KiB
Markdown
71 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`.
|