- TypeScript 90.1%
- CSS 9.8%
- HTML 0.1%
Client : URL de l'API/Socket.io centralisée dans src/config.ts (plus de duplication localhost dans api.ts et mpSocket.ts) et fournie par les fichiers .env Vite — .env.development (localhost) et .env.production (domaine public), + .env.example. Build prod vérifié : VITE_API_URL bien injectée. Serveur : ajout de .env.example documentant toutes les variables (CLIENT_ORIGIN, DISCORD_REDIRECT_URI, NODE_ENV, JWT_SECRET…) ; log de démarrage sans localhost en dur. La config lisait déjà tout depuis .env. README : section déploiement (domaines séparés front/api) + tableau des variables. 114 tests au vert, typecheck serveur + client OK, build client OK. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| client | ||
| docs/superpowers/specs | ||
| server | ||
| .gitignore | ||
| README.md | ||
Nyx 🎰
Casino virtuel communautaire : connexion via Discord, jetons purement virtuels (aucun argent réel), jeu de blackjack avec logique 100 % côté serveur.
Architecture
nyx/
├── server/ API Node + Express + TypeScript, SQLite via Prisma
│ (couches routes → services → repositories → Prisma)
└── client/ SPA React + Vite + TypeScript
- server : source de vérité unique (soldes, cartes, résultats). Voir la
spec de conception dans
docs/superpowers/specs/. - client : affichage et actions ; ne calcule jamais un résultat de jeu.
Prérequis
- Node.js ≥ 20
- Une application Discord (pour l'OAuth2) :
https://discord.com/developers/applications
- Onglet OAuth2 → ajouter le Redirect :
http://localhost:4000/api/auth/discord/callback - Récupérer Client ID et Client Secret.
- Onglet OAuth2 → ajouter le Redirect :
Configuration
Aucune URL n'est codée en dur : tout passe par des fichiers .env.
Serveur — copier server/.env.example en server/.env et remplir
(DISCORD_CLIENT_ID/SECRET, JWT_SECRET, ADMIN_DISCORD_IDS, CLIENT_ORIGIN,
DISCORD_REDIRECT_URI…).
Client — l'URL de l'API est injectée au build par Vite :
client/.env.development→ utilisé parvite(dev), pointe surhttp://localhost:4000.client/.env.production→ utilisé parvite build(prod), pointe sur le domaine public de l'API (ex.https://api.nyx.envoys.fr).
En production (domaines séparés)
Front sur https://nyx.envoys.fr, API sur https://api.nyx.envoys.fr :
| Fichier | Variable | Valeur |
|---|---|---|
server/.env |
NODE_ENV |
production |
server/.env |
CLIENT_ORIGIN |
https://nyx.envoys.fr |
server/.env |
DISCORD_REDIRECT_URI |
https://api.nyx.envoys.fr/api/auth/discord/callback |
client/.env.production |
VITE_API_URL |
https://api.nyx.envoys.fr |
La Redirect doit aussi être enregistrée à l'identique dans l'app Discord.
Build : cd server && npm run build (→ dist/, lancer avec npm start) et
cd client && npm run build (→ dist/ statique à servir).
Démarrage (développement)
Terminal 1 — API :
cd server
npm install
npm run prisma:push # crée la base SQLite (server/dev.db)
npm run dev # http://localhost:4000
Terminal 2 — client :
cd client
npm install
npm run dev # http://localhost:5173
Ouvre http://localhost:5173 puis « Se connecter avec Discord ».
Tests
cd server
npm test # domaine, services, repositories, routes (Vitest)
Passer à PostgreSQL plus tard
Grâce à la couche repositories, seul Prisma change :
- Dans
server/prisma/schema.prisma, mettreprovider = "postgresql". - Adapter
DATABASE_URL. npm run prisma:migrate.
Aucun service ni aucune route à modifier.
Périmètre v1
Blackjack, connexion Discord, solde de départ, gestion admin des jetons. Hors périmètre (v2) : bot Discord, autres jeux, achat de jetons.