npm package: @ovyn/api-server
Description: Serveur REST type json-server + auth sans dépendances externes
Author: Flavian Ovyn
Latest version: 1.1.1

# @ovyn/api-server

Un serveur REST léger type `json-server` avec authentification JWT, support WebSockets et rechargement à chaud, le tout sans dépendances externes.

## Installation

```bash
# Installation globale
npm install -g @ovyn/api-server

# Utilisation directe via npx
npx @ovyn/api-server db.json
```

## Utilisation CLI

```bash
api-server [options] [dbFile]
```

### Options

- `-p, --port <number>` : Port d'écoute (défaut : 3000)
- `-s, --secret <string>` : Secret JWT pour l'authentification (défaut : `change-me`)
- `-r, --rules <path>` : Chemin vers un fichier de règles JSON (facultatif)
- `-v, --version` : Affiche la version
- `-h, --help` : Affiche l'aide

### Exemples

```bash
# Lancer avec un fichier spécifique et un secret
api-server db.json --port 3000 --secret monsecret

# Utiliser un fichier de règles pour sécuriser les accès
api-server --rules rules.json
```

## Structure des données (`db.json`)

Le fichier de base de données est un objet JSON où chaque clé représente une collection (un tableau d'objets).

```json
{
  "posts": [
    { "id": 1, "title": "Hello World", "userId": 1 },
    { "id": 2, "title": "Mon deuxième post", "userId": 1 }
  ],
  "comments": [
    { "id": 1, "body": "Super !", "postId": 1 }
  ]
}
```

## Sécurisation et Règles (`rules.json`)

Vous pouvez définir des permissions par collection dans un fichier `rules.json`.
Les niveaux de permission sont :
- `*` : Public (ouvert à tous)
- `auth` : Utilisateur connecté requis (via token JWT)
- `owner` : Propriétaire de la ressource uniquement (vérifie le champ `userId` par défaut)

Exemple de `rules.json` :

```json
{
  "posts": {
    "GET": "*",
    "POST": "auth",
    "PUT": "owner",
    "DELETE": "owner"
  },
  "users": {
    "GET": "owner",
    "PUT": "owner"
  }
}
```

> **Note** : Les utilisateurs avec le rôle `admin` (défini dans le token ou la DB) ont accès à tout par défaut.

## Fonctionnalités

### Authentification JWT
Le serveur gère nativement le hashage des mots de passe et la génération de tokens.
- `POST /register` : Inscription d'un utilisateur
- `POST /login` : Connexion et récupération du token

Un utilisateur **admin** par défaut est créé au premier lancement si la collection `users` est vide : `admin@bstorm.be` / `Test1234=`.

### Filtrage, Tri et Pagination
- Filtrage : `GET /posts?title=Hello`
- Recherche : `GET /posts?q=searchterm`
- Tri : `GET /posts?_sort=id&_order=desc`
- Pagination : `GET /posts?_page=1&_limit=10`

### WebSockets
Le serveur supporte les WebSockets pour les notifications en temps réel.

**Souscription :**
Envoyez un message JSON pour vous abonner à une collection :
```json
{ "type": "subscribe", "channel": "posts" }
```

**Notifications :**
Vous recevrez des messages lors des modifications :
```json
{ "type": "create", "channel": "posts", "data": { "id": 3, "title": "New" } }
```

### Rechargement à chaud (Hot-reload)
Les modifications apportées au fichier `db.json` ou au fichier de règles sont détectées et appliquées instantanément sans redémarrage.

## Tests

Le projet utilise Jest pour sa suite de tests :

```bash
npm test
```

## Licence

MIT