# RollerLogic API

Fastify + MySQL service qui porte la progression, l’économie et l’authentification simplifiée du prototype RollerLogic.

## Pré‑requis locaux

```bash
cd rollerlogic-api
cp .env.example .env         # définir DB_* + APP_* + secrets
npm install
npm run dev                  # redémarre automatiquement
```

Le serveur écoute par défaut sur le port `3000`. Point votre frontend sur `VITE_API_URL=http://localhost:3000`.

## Endpoints

### Auth

- `POST /auth/login`  
  `Content-Type: application/json`  
  Body : `{ "email": "user@mail.com", "password": "motdepasse" }`  
  Réponse : `{ user, wallet, progress, token, refreshToken }` avec `wallet` (points + inventaire) et `progress` (difficultés).

- `POST /auth/register`  
  `Content-Type: application/json`  
  Body : `{ "email": "user@mail.com", "password": "motdepasse", "displayName": "Player" }`  
  Réponse : `{ user, wallet, progress, token, refreshToken }`

- `POST /auth/refresh`  
  `Content-Type: application/json`  
  Body : `{ "refreshToken": "..." }`  
  Réponse : `{ token, refreshToken }`

- `POST /auth/request-reset`  
  `Content-Type: application/json`  
  Body : `{ "email": "user@mail.com" }`  
  Réponse : `{ ok: true }` (et `resetToken` en dev). En production, envoie un email via SMTP.

- `POST /auth/reset-password`  
  `Content-Type: application/json`  
  Body : `{ "token": "...", "password": "nouveauMotDePasse" }`  
  Réponse : `{ ok: true }`

Les refresh tokens sont **rotés** : chaque appel révoque l’ancien token et en génère un nouveau.

- `POST /auth/logout`  
  `Authorization: Bearer <token>`  
  Body (optionnel) : `{ "refreshToken": "..." }`  
  Réponse : `{ ok: true }`

### Wallet (auth requis)

Toutes les routes ci‑dessous exigent l’en‑tête `Authorization: Bearer <token>`.

- `GET /wallet/:userId` → lecture du portefeuille (`points` + `hints|undos|replays`).
- `POST /wallet/reward` → incrémente les points : body `{ userId, difficulty }`.
- `POST /wallet/purchase` → consomme les points sur un pack d’aides : body `{ userId, packId }`.
- `POST /wallet/consume` → décrémente une aide consommée (`hint | undo | replay`).

### Progression (auth requis)

- `GET /progress/:userId` → lecture de progression par difficulté.
- `POST /progress/:userId/increment` → incrémente la progression sur une difficulté (`{ difficulty }`).

### Admin (compte admin requis)

- `GET /admin/overview`  
  Header : `Authorization: Bearer <token>`  
  Retourne : compteurs globaux (users, wallets, sessions actives, audit logs).

- `GET /admin/dashboard`  
  Header : `Authorization: Bearer <token>`  
  Retourne : mini dashboard HTML (statut + raccourcis).

### Santé & monitoring

- `GET /` → retourne `{ name, env }`.
- `GET /health` → vérifie la connexion MySQL.

## Base de données

Avant déploiement, exécuter `src/schema.sql` sur votre instance MySQL (OVH Cloud, voir `docs/deployment/ovh-deployment.md`). Le schéma crée les tables `users`, `wallets`, `progress`, `refresh_tokens` et `audit_log`.

Pour activer un compte admin :

```sql
UPDATE users SET is_admin = 1 WHERE email = 'admin@exemple.com';
```

Les variables d’environnement sont décrites dans `.env.example` : hôte/port DB, secrets (`DB_PASSWORD_FILE`, `JWT_SECRET_FILE`), paramètres SMTP, etc.

## Dockerisation & OVH

```bash
docker build -t rollerlogic-api .
docker run --env-file .env -p 3000:3000 rollerlogic-api
```

Le guide `docs/deployment/ovh-deployment.md` accompagne la création de l’image (`ghcr.io/...`), les secrets Docker et le stack Traefik/TLS sur OVH. Déployer via `docker stack deploy -c rollerlogic-stack.yml rollerlogic`.
