Skip to content

API Documentation

Francois edited this page Feb 6, 2026 · 10 revisions

REST API Documentation

Documentation complรจte des endpoints des services Gateway, Auth et Users du projet ft_transcendence.


Table des matiรจres


๐Ÿ“Š Vue d'ensemble des routes

Tableau gรฉnรฉral des endpoints

Service Mรฉthode Endpoint Description Auth Status
Gateway GET / Message de bienvenue ๐ŸŒ Public โœ…
Gateway GET /help Liste des routes disponibles ๐ŸŒ Public โœ…
Gateway GET /health Health check du Gateway ๐ŸŒ Public โœ…
Gateway GET /health/:name Health check d'un service spรฉcifique ๐ŸŒ Public โœ…
Gateway GET /healthAll Health check de tous les services ๐ŸŒ Public โœ…
Auth GET /api/auth/ Status du service Auth ๐ŸŒ Public โœ…
Auth GET /api/auth/health Health check ๐ŸŒ Public โœ…
Auth POST /api/auth/register Inscription d'un nouvel utilisateur ๐ŸŒ Public โœ…
Auth POST /api/auth/login Connexion utilisateur ๐ŸŒ Public โœ…
Auth POST /api/auth/logout Dรฉconnexion utilisateur ๐Ÿ”’ JWT โœ…
Auth GET /api/auth/verify Vรฉrification de token JWT ๐Ÿ”’ JWT โœ…
Auth GET /api/auth/me Informations utilisateur courant ๐Ÿ”’ JWT ๐Ÿšง
Auth POST /api/auth/2fa/setup Initialise la configuration 2FA ๐Ÿ”’ JWT โœ…
Auth POST /api/auth/2fa/setup/verify Vรฉrifie et active la 2FA ๐Ÿ”’ JWT โœ…
Auth POST /api/auth/2fa/verify Vรฉrifie un code 2FA au login ๐Ÿ”’ Temp โœ…
Auth POST /api/auth/2fa/disable Dรฉsactive la 2FA ๐Ÿ”’ JWT โœ…
Auth POST /api/auth/heartbeat Envoie un heartbeat pour rester en ligne ๐Ÿ”’ JWT โœ…
Auth GET /api/auth/is-online/:name Vรฉrifie si un utilisateur est en ligne ๐Ÿ”’ JWT โœ…
Auth GET /api/auth/admin/users Liste tous les utilisateurs ๐Ÿ”’ Admin โœ…
Auth PUT /api/auth/admin/users/:id Modifie un utilisateur ๐Ÿ”’ Admin โœ…
Auth DELETE /api/auth/admin/users/:id Supprime un utilisateur ๐Ÿ”’ Admin โœ…
Auth POST /api/auth/admin/users/:id/disable-2fa Dรฉsactive la 2FA d'un utilisateur ๐Ÿ”’ Admin โœ…
Users GET /api/users/:id Rรฉcupรจre un profil par ID ๐Ÿ”’ JWT ๐Ÿ‘ท
Users GET /api/users/username/:username Rรฉcupรจre un profil par username ๐Ÿ”’ JWT โœ…
Users PATCH /api/users/avatar/:username Modifie l'avatar d'un utilisateur ๐Ÿ”’ JWT โœ…
Users POST /users/ Crรฉe un profil (route interne) ๐Ÿ”’ Internal โœ…
Users GET /api/users/friends/:id Liste les amis d'un utilisateur ๐Ÿ”’ JWT ๐Ÿ‘ท
Users POST /api/users/friends Envoie une demande d'ami ๐Ÿ”’ JWT โœ…
Users PATCH /api/users/friends/:id/status Modifie le statut d'une amitiรฉ ๐Ÿ”’ JWT ๐Ÿ‘ท
Users PATCH /api/users/friends/:id/nickname Modifie le surnom d'un ami ๐Ÿ”’ JWT ๐Ÿ‘ท
Users DELETE /api/users/friends/:id Supprime une relation d'amitiรฉ ๐Ÿ”’ JWT โœ…
Game POST /api/game/rl/reset Rรฉinitialise une session ๐Ÿ”’ JWT ๐Ÿ‘ท
Game POST /api/game/rl/step - ๐Ÿ”’ JWT ๐Ÿ‘ท
Game POST /api/game/rl/state ร‰tat d'une session de jeu ๐Ÿ”’ JWT ๐Ÿ‘ท
AI POST /api/ai/predict Demande le mouvement de la raquette pour l'IA ๐Ÿ”’ JWT ๐Ÿ‘ท

Lรฉgende :

  • ๐ŸŒ Public : Accessible sans authentification
  • ๐Ÿ”’ JWT : Nรฉcessite un token JWT valide
  • ๐Ÿ”’ Temp : Nรฉcessite un token temporaire (2FA)
  • ๐Ÿ”’ Admin : Nรฉcessite un rรดle administrateur
  • ๐Ÿ”’ Internal : Route interne entre services
  • โœ… Implรฉmentรฉ | ๐Ÿ‘ท En dรฉveloppement | ๐Ÿšง DEV ONLY

Statistiques

  • Total des routes : 36
  • Routes publiques : 7
  • Routes authentifiรฉes : 25
  • Routes admin : 4
  • Services : 4 (Gateway, Auth, Users, AI)

๐ŸŒ Gateway Service

Le Gateway est le point d'entrรฉe unique de l'application. Il route les requรชtes vers les services appropriรฉs et valide les JWT localement.

Public Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
GET / Message de bienvenue ๐ŸŒ Public Global โœ…
GET /help Liste des routes disponibles ๐ŸŒ Public Global โœ…

GET /

Response 200:

{
  "message": "Welcome to the Gateway API, check /help"
}

GET /help

Liste toutes les routes disponibles du Gateway avec leur mรฉthode HTTP.

Response 200:

{
  "routes": {
    "public": {
      "/": "GET - Welcome message",
      "/help": "GET - This help message",
      "/healthAll": "GET - Health check all services",
      "/health/:name": "GET - Health check service by name",
      "/auth/*": "Proxied to Auth service",
      "/users/*": "Proxied to Users service",
      "/game/*": "Proxied to Game service",
      "/block/*": "Proxied to Blockchain service"
    }
  }
}

Health Check Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
GET /health Health check du Gateway ๐ŸŒ Public Global โœ…
GET /health/:name Health check d'un service spรฉcifique ๐ŸŒ Public Global โœ…
GET /healthAll Health check de tous les services ๐ŸŒ Public Global โœ…

GET /health

Vรฉrifie la santรฉ du Gateway lui-mรชme.

Response 200:

{
  "status": "healthy",
  "service": "gateway",
  "timestamp": "2026-01-27T12:00:00Z"
}

GET /health/:name

Vรฉrifie la santรฉ d'un service spรฉcifique.

URL Parameters:

  • name (string) : Nom du service (auth, users, game, block)

Response 200:

{
  "status": "healthy",
  "service": "auth",
  "timestamp": "2026-01-27T12:00:00Z"
}

Erreurs possibles:

  • 404 Not Found - Service inconnu
  • 503 Service Unavailable - Service injoignable

GET /healthAll

Vรฉrifie la santรฉ de tous les services enregistrรฉs.

Response 200:

{
  "gateway": {
    "status": "healthy",
    "timestamp": "2026-01-27T12:00:00Z"
  },
  "auth": {
    "status": "healthy",
    "timestamp": "2026-01-27T12:00:00Z"
  },
  "users": {
    "status": "healthy",
    "timestamp": "2026-01-27T12:00:00Z"
  },
  "game": {
    "status": "healthy",
    "timestamp": "2026-01-27T12:00:00Z"
  },
  "block": {
    "status": "healthy",
    "timestamp": "2026-01-27T12:00:00Z"
  }
}

๐Ÿ” Auth Service

Service d'authentification gรฉrant les utilisateurs, JWT, 2FA et statuts en ligne.

Authentication Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
GET /api/auth/ Status du service Auth ๐ŸŒ Public Global โœ…
GET /api/auth/health Health check ๐ŸŒ Public Global โœ…
POST /api/auth/register Inscription d'un nouvel utilisateur ๐ŸŒ Public 5/5min (prod), 100/5min (dev) โœ…
POST /api/auth/login Connexion utilisateur ๐ŸŒ Public 5/5min (prod), 100/5min (dev) โœ…
POST /api/auth/logout Dรฉconnexion utilisateur ๐Ÿ”’ JWT Global โœ…
GET /api/auth/verify Vรฉrification de token JWT ๐Ÿ”’ JWT Global โœ…
GET /api/auth/me Informations utilisateur courant ๐Ÿ”’ JWT Global ๐Ÿšง DEV ONLY

GET /api/auth/

Response 200:

{
  "message": "Auth service is running"
}

GET /api/auth/health

Response 200:

{
  "status": "healthy"
}

POST /api/auth/register

Crรฉe un nouveau compte utilisateur.

Rate Limit: 5 requรชtes/5min (prod), 100/5min (dev)

Request Body:

{
  "username": "john_doe",
  "email": "john@example.com",
  "password": "SecurePass123!"
}

Validation:

  • username: 4-20 caractรจres alphanumรฉriques (_- autorisรฉs), pattern: /^[a-zA-Z0-9_]+$/
  • email: Format email valide, max 100 caractรจres
  • password: Min 8 caractรจres, max 100 caractรจres, au moins 1 majuscule, 1 minuscule, 1 chiffre

Response 201:

{
  "success": true,
  "message": "User registered successfully",
  "userId": 42
}

Erreurs possibles:

  • 400 Bad Request - Donnรฉes invalides ou manquantes
  • 409 Conflict - Username ou email dรฉjร  utilisรฉ
  • 429 Too Many Requests - Rate limit dรฉpassรฉ

POST /api/auth/login

Authentifie un utilisateur et retourne un JWT.

Rate Limit: 5 requรชtes/5min (prod), 100/5min (dev)

Request Body:

{
  "username": "john_doe",
  "password": "SecurePass123!"
}

Ou avec email:

{
  "email": "john@example.com",
  "password": "SecurePass123!"
}

Response 200 (Sans 2FA):

{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 42,
  "username": "john_doe",
  "require2FA": false
}

Response 200 (Avec 2FA activรฉ):

{
  "success": true,
  "require2FA": true,
  "tempToken": "temporary_token_for_2fa_verification",
  "message": "2FA code required"
}

Erreurs possibles:

  • 400 Bad Request - Donnรฉes manquantes ou invalides
  • 401 Unauthorized - Identifiants incorrects
  • 429 Too Many Requests - Rate limit dรฉpassรฉ

POST /api/auth/logout

Dรฉconnecte l'utilisateur et invalide le token.

Headers:

Authorization: Bearer <token>

Response 200:

{
  "success": true,
  "message": "Logged out successfully"
}

GET /api/auth/verify

Vรฉrifie la validitรฉ d'un token JWT.

Headers:

Authorization: Bearer <token>

Response 200:

{
  "valid": true,
  "userId": 42,
  "username": "john_doe",
  "role": "user"
}

Erreurs possibles:

  • 401 Unauthorized - Token invalide ou expirรฉ

GET /api/auth/me

Retourne les informations de l'utilisateur connectรฉ.

โš ๏ธ DEV ONLY - ร€ supprimer en production

Headers:

Authorization: Bearer <token>

Response 200:

{
  "userId": 42,
  "username": "john_doe",
  "email": "john@example.com",
  "role": "user",
  "twoFactorEnabled": true,
  "createdAt": "2026-01-15T10:30:00Z"
}

2FA Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
POST /api/auth/2fa/setup Initialise la configuration 2FA ๐Ÿ”’ JWT 5/5min (prod), 100/5min (dev) โœ…
POST /api/auth/2fa/setup/verify Vรฉrifie et active la 2FA ๐Ÿ”’ JWT 5/5min (prod), 100/5min (dev) โœ…
POST /api/auth/2fa/verify Vรฉrifie un code 2FA au login ๐Ÿ”’ Temp Token 5/5min (prod), 100/5min (dev) โœ…
POST /api/auth/2fa/disable Dรฉsactive la 2FA ๐Ÿ”’ JWT Global โœ…

POST /api/auth/2fa/setup

Gรฉnรจre un secret TOTP et un QR code pour configurer l'authentification ร  deux facteurs.

Rate Limit: 5 requรชtes/5min (prod), 100/5min (dev)

Headers:

Authorization: Bearer <token>

Response 200:

{
  "success": true,
  "secret": "JBSWY3DPEHPK3PXP",
  "qrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
  "manualEntryKey": "JBSW Y3DP EHPK 3PXP"
}

Note: Le secret n'est pas encore sauvegardรฉ en base. Il faut appeler /2fa/setup/verify avec un code valide pour activer la 2FA.

Configuration TOTP:

  • Window: ยฑ1 (ยฑ30 secondes)
  • Step: 30 secondes
  • Digits: 6
  • Algorithm: SHA1 (standard TOTP)

POST /api/auth/2fa/setup/verify

Vรฉrifie le code TOTP et active la 2FA pour l'utilisateur.

Rate Limit: 5 requรชtes/5min (prod), 100/5min (dev)

Headers:

Authorization: Bearer <token>

Request Body:

{
  "token": "123456",
  "secret": "JBSWY3DPEHPK3PXP"
}

Response 200:

{
  "success": true,
  "message": "2FA activated successfully",
  "backupCodes": [
    "AB12-CD34-EF56",
    "GH78-IJ90-KL12",
    "MN34-OP56-QR78",
    "ST90-UV12-WX34",
    "YZ56-AB78-CD90"
  ]
}

Erreurs possibles:

  • 400 Bad Request - Code invalide ou expirรฉ
  • 409 Conflict - 2FA dรฉjร  activรฉe

POST /api/auth/2fa/verify

Vรฉrifie le code 2FA aprรจs un login avec 2FA activรฉe.

Rate Limit: 5 requรชtes/5min (prod), 100/5min (dev)

Headers:

Authorization: Bearer <tempToken>

Request Body:

{
  "token": "123456"
}

Response 200:

{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 42,
  "username": "john_doe"
}

Erreurs possibles:

  • 400 Bad Request - Code invalide
  • 401 Unauthorized - Temp token invalide ou expirรฉ
  • 429 Too Many Requests - Trop de tentatives

POST /api/auth/2fa/disable

Dรฉsactive l'authentification ร  deux facteurs.

Headers:

Authorization: Bearer <token>

Request Body:

{
  "password": "SecurePass123!"
}

Response 200:

{
  "success": true,
  "message": "2FA disabled successfully"
}

Erreurs possibles:

  • 400 Bad Request - Mot de passe requis
  • 401 Unauthorized - Mot de passe incorrect

User Status Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
POST /api/auth/heartbeat Envoie un heartbeat pour rester "en ligne" ๐Ÿ”’ JWT 10/10s โœ…
GET /api/auth/is-online/:name Vรฉrifie si un utilisateur est en ligne ๐Ÿ”’ JWT 200/min (prod), 1000/min (dev) โœ…

POST /api/auth/heartbeat

Envoie un signal heartbeat pour marquer l'utilisateur comme en ligne.

Rate Limit: 10 requรชtes/10s

Headers:

Authorization: Bearer <token>

Response 200:

{
  "success": true,
  "online": true,
  "expiresIn": 30
}

Note: Le statut en ligne expire aprรจs 30 secondes sans heartbeat. Les clients doivent envoyer un heartbeat toutes les 20-25 secondes pour rester en ligne.

GET /api/auth/is-online/:name

Vรฉrifie si un utilisateur est actuellement en ligne.

Rate Limit: 200 requรชtes/min (prod), 1000/min (dev)

URL Parameters:

  • name (string) : Username de l'utilisateur

Headers:

Authorization: Bearer <token>

Response 200:

{
  "username": "john_doe",
  "online": true,
  "lastSeen": "2026-01-27T12:34:56Z"
}

Admin Routes

Toutes les routes admin nรฉcessitent un rรดle ADMIN et sont prรฉfixรฉes par /api/auth/admin.

โš ๏ธ Les headers X-User-Id, X-User-Name et X-User-Role sont injectรฉs automatiquement par le Gateway aprรจs validation du JWT.

Mรฉthode Endpoint Description Auth Rate Limit Status
GET /api/auth/admin/users Liste tous les utilisateurs ๐Ÿ”’ Admin 50/min โœ…
PUT /api/auth/admin/users/:id Modifie un utilisateur ๐Ÿ”’ Admin 20/min โœ…
DELETE /api/auth/admin/users/:id Supprime un utilisateur ๐Ÿ”’ Admin 10/min โœ…
POST /api/auth/admin/users/:id/disable-2fa Dรฉsactive la 2FA d'un utilisateur ๐Ÿ”’ Admin 10/min โœ…

GET /api/auth/admin/users

Liste tous les utilisateurs de la plateforme.

Rate Limit: 50 requรชtes/min

Headers:

Authorization: Bearer <admin_token>
X-User-Id: <admin_user_id>      (injectรฉ par Gateway)
X-User-Name: <admin_username>   (injectรฉ par Gateway)
X-User-Role: admin               (injectรฉ par Gateway)

Query Parameters (optionnels):

  • page (number) : Numรฉro de page (dรฉfaut: 1)
  • limit (number) : Nombre de rรฉsultats par page (dรฉfaut: 50, max: 100)
  • search (string) : Recherche par username ou email
  • role (string) : Filtre par rรดle (user, admin)

Response 200:

{
  "users": [
    {
      "id": 1,
      "username": "john_doe",
      "email": "john@example.com",
      "role": "user",
      "twoFactorEnabled": true,
      "createdAt": "2026-01-15T10:30:00Z",
      "lastLogin": "2026-01-27T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 150,
    "pages": 3
  }
}

Erreurs possibles:

  • 401 Unauthorized - Token invalide
  • 403 Forbidden - Utilisateur non admin

PUT /api/auth/admin/users/:id

Modifie les informations d'un utilisateur.

Rate Limit: 20 requรชtes/min

URL Parameters:

  • id (number) : ID de l'utilisateur

Headers:

Authorization: Bearer <admin_token>
X-User-Id: <admin_user_id>      (injectรฉ par Gateway)
X-User-Name: <admin_username>   (injectรฉ par Gateway)

Request Body:

{
  "username": "new_username",
  "email": "new@example.com",
  "role": "admin"
}

Response 200:

{
  "success": true,
  "user": {
    "id": 42,
    "username": "new_username",
    "email": "new@example.com",
    "role": "admin",
    "updatedAt": "2026-01-27T12:35:00Z"
  }
}

Erreurs possibles:

  • 400 Bad Request - Donnรฉes invalides
  • 403 Forbidden - Non autorisรฉ
  • 404 Not Found - Utilisateur inexistant
  • 409 Conflict - Username ou email dรฉjร  utilisรฉ

DELETE /api/auth/admin/users/:id

Supprime un utilisateur de maniรจre permanente.

Rate Limit: 10 requรชtes/min

URL Parameters:

  • id (number) : ID de l'utilisateur

Headers:

Authorization: Bearer <admin_token>
X-User-Id: <admin_user_id>      (injectรฉ par Gateway)
X-User-Name: <admin_username>   (injectรฉ par Gateway)

Response 200:

{
  "success": true,
  "message": "User deleted successfully",
  "userId": 42
}

Erreurs possibles:

  • 403 Forbidden - Non autorisรฉ (ne peut pas supprimer un admin)
  • 404 Not Found - Utilisateur inexistant

POST /api/auth/admin/users/:id/disable-2fa

Dรฉsactive la 2FA pour un utilisateur (utile si l'utilisateur a perdu accรจs ร  son authenticator).

Rate Limit: 10 requรชtes/min

URL Parameters:

  • id (number) : ID de l'utilisateur

Headers:

Authorization: Bearer <admin_token>
X-User-Id: <admin_user_id>      (injectรฉ par Gateway)
X-User-Name: <admin_username>   (injectรฉ par Gateway)

Response 200:

{
  "success": true,
  "message": "2FA disabled for user",
  "userId": 42,
  "username": "john_doe"
}

Erreurs possibles:

  • 403 Forbidden - Non autorisรฉ
  • 404 Not Found - Utilisateur inexistant
  • 409 Conflict - 2FA dรฉjร  dรฉsactivรฉe

๐Ÿ‘ฅ Users Service

Service de gestion des profils utilisateurs et des relations d'amitiรฉ.

โš ๏ธ Note: Returned id is the authId in DB. users/ prefix should perhaps be changed to users/profiles

Profile Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
GET /api/users/:id Rรฉcupรจre un profil par ID ๐Ÿ”’ JWT Global ๐Ÿ‘ท
GET /api/users/username/:username Rรฉcupรจre un profil par username ๐Ÿ”’ JWT Global โœ…
PATCH /api/users/avatar/:id Modifie l'avatar d'un utilisateur ๐Ÿ”’ JWT Global ๐Ÿ‘ท
POST /users/ Crรฉe un profil (route interne) ๐Ÿ”’ Internal - โœ…

GET /api/users/:id

Rรฉcupรจre les informations de profil d'un utilisateur par son ID.

URL Parameters:

  • id (number) : Auth ID de l'utilisateur

Headers:

Authorization: Bearer <token>

Response 200:

{
  "authId": 1,
  "username": "john_doe",
  "avatarUrl": "default.png"
}

Erreurs possibles:

  • 400 Bad Request - ID invalide
  • 404 Not Found - Utilisateur inexistant

GET /api/users/username/:username

Rรฉcupรจre les informations de profil d'un utilisateur par son username.

URL Parameters:

  • username (string) : Username de l'utilisateur

Headers:

Authorization: Bearer <token>

Response 200:

{
  "authId": 1,
  "username": "john_doe",
  "avatarUrl": "default.png"
}

Erreurs possibles:

  • 400 Bad Request - Username invalide
  • 404 Not Found - Utilisateur inexistant

PATCH /api/users/avatar/:id

Modifie l'URL de l'avatar d'un utilisateur.

URL Parameters:

  • id (number) : Auth ID de l'utilisateur

Headers:

Authorization: Bearer <token>

Request Body:

{
  "avatarUrl": "new_avatar.png"
}

Response 200:

{
  "authId": 1,
  "username": "john_doe",
  "avatarUrl": "new_avatar.png"
}

Erreurs possibles:

  • 400 Bad Request - Donnรฉes invalides
  • 401 Unauthorized - Non autorisรฉ
  • 404 Not Found - Utilisateur inexistant

POST /users/

Crรฉe un nouveau profil utilisateur. Route interne appelรฉe par le service Auth aprรจs inscription.

๐Ÿ”’ Route interne - Authentification par API Key ou header interne

Request Body:

{
  "id": 42,
  "username": "john_doe",
  "email": "john@example.com"
}

Response 201:

{
  "authId": 42,
  "username": "john_doe",
  "avatarUrl": "default.png"
}

Erreurs possibles:

  • 400 Bad Request - Donnรฉes manquantes ou invalides
  • 409 Conflict - Profil dรฉjร  existant

Friends Routes

Mรฉthode Endpoint Description Auth Rate Limit Status
GET /api/users/friends/:id Liste les amis d'un utilisateur ๐Ÿ”’ JWT Global ๐Ÿ‘ท
POST /api/users/friends Envoie une demande d'ami ๐Ÿ”’ JWT Global โœ…
PATCH /api/users/friends/:id/status Modifie le statut d'une amitiรฉ ๐Ÿ”’ JWT Global ๐Ÿ‘ท
PATCH /api/users/friends/:id/nickname Modifie le surnom d'un ami ๐Ÿ”’ JWT Global ๐Ÿ‘ท
DELETE /api/users/friends/:id Supprime une relation d'amitiรฉ ๐Ÿ”’ JWT Global ๐Ÿ‘ท

GET /api/users/friends/:id

Liste toutes les relations d'amitiรฉ d'un utilisateur.

URL Parameters:

  • id (number) : Auth ID de l'utilisateur

Headers:

Authorization: Bearer <token>

Response 200:

[
  {
    "id": 1,
    "status": "accepted",
    "nickname": "Best Friend",
    "friend": {
      "authId": 2,
      "username": "jane_doe",
      "avatarUrl": "default.png"
    }
  }
]

Erreurs possibles:

  • 400 Bad Request - ID invalide
  • 401 Unauthorized - Non authentifiรฉ
  • 404 Not Found - Utilisateur inexistant

POST /api/users/friends

Envoie une demande d'ami ร  un utilisateur.

Headers:

Authorization: Bearer <token>

Request Body:

{
  "id": 2
}

Response 201:

{
  "id": 1,
  "status": "pending",
  "nickname": null,
  "friend": {
    "authId": 2,
    "username": "jane_doe",
    "avatarUrl": "default.png"
  }
}

Erreurs possibles:

  • 400 Bad Request - ID invalide ou manquant
  • 401 Unauthorized - Non authentifiรฉ
  • 409 Conflict - Relation d'amitiรฉ dรฉjร  existante
  • 422 Unprocessable Entity - Ne peut pas s'ajouter soi-mรชme

PATCH /api/users/friends/:id/status

Modifie le statut d'une relation d'amitiรฉ (accepter/refuser une demande).

URL Parameters:

  • id (number) : ID de la relation d'amitiรฉ

Headers:

Authorization: Bearer <token>

Request Body:

{
  "status": "accepted"
}

Valeurs possibles pour status:

  • accepted : Accepter la demande
  • rejected : Refuser la demande
  • pending : Remettre en attente
  • blocked : Bloquer l'utilisateur

Response 200:

{
  "id": 1,
  "status": "accepted",
  "nickname": null,
  "friend": {
    "authId": 2,
    "username": "jane_doe",
    "avatarUrl": "default.png"
  }
}

Erreurs possibles:

  • 400 Bad Request - Statut invalide
  • 401 Unauthorized - Non authentifiรฉ
  • 404 Not Found - Relation inexistante

PATCH /api/users/friends/:id/nickname

Modifie le surnom personnalisรฉ d'un ami.

URL Parameters:

  • id (number) : ID de la relation d'amitiรฉ

Headers:

Authorization: Bearer <token>

Request Body:

{
  "nickname": "Best Friend"
}

Response 200:

{
  "id": 1,
  "status": "accepted",
  "nickname": "Best Friend",
  "friend": {
    "authId": 2,
    "username": "jane_doe",
    "avatarUrl": "default.png"
  }
}

Erreurs possibles:

  • 400 Bad Request - Nickname invalide
  • 401 Unauthorized - Non authentifiรฉ
  • 404 Not Found - Relation inexistante

DELETE /api/users/friends/:id

Supprime une relation d'amitiรฉ.

URL Parameters:

  • id (number) : ID de la relation d'amitiรฉ

Headers:

Authorization: Bearer <token>

Response 200:

{
  "id": 1,
  "status": "deleted",
  "nickname": null,
  "friend": {
    "authId": 2,
    "username": "jane_doe",
    "avatarUrl": "default.png"
  }
}

Erreurs possibles:

  • 400 Bad Request - ID invalide
  • 401 Unauthorized - Non authentifiรฉ
  • 404 Not Found - Relation inexistante

GAME Service

RL Routes

POST /rl/step

POST /rl/state

POST /rl/reset


AI Service

POST /predict

Predicts the next move for the AI paddle.

Request Body:

{
  "ball_x": 400,
  "ball_y": 300,
  "ball_velocity_x": 5,
  "ball_velocity_y": -2,
  "paddle_y": 250,
  "opponent_y": 250
}

Response:

{
  "action": 1  // 0=STOP, 1=UP, 2=DOWN
}

๐Ÿ“ฆ DTOs & Models

ProfileDTO

Structure d'un profil utilisateur.

interface ProfileDTO {
  authId: number;        // ID utilisateur (clรฉ primaire du service Auth)
  username: string;      // Username unique
  avatarUrl: string;     // URL de l'avatar
}

Exemple:

{
  "authId": 1,
  "username": "john_doe",
  "avatarUrl": "default.png"
}

FriendshipUnifiedDTO

Structure d'une relation d'amitiรฉ.

interface FriendshipUnifiedDTO {
  id: number;             // ID de la relation
  status: FriendshipStatus; // Statut de la relation
  nickname: string | null;  // Surnom personnalisรฉ (optionnel)
  friend: ProfileDTO;       // Profil de l'ami
}

type FriendshipStatus = 'pending' | 'accepted' | 'rejected' | 'blocked';

Exemple:

{
  "id": 1,
  "status": "accepted",
  "nickname": "Best Friend",
  "friend": {
    "authId": 2,
    "username": "jane_doe",
    "avatarUrl": "default.png"
  }
}

User Model (Auth Service)

Structure utilisateur en base de donnรฉes SQLite (service Auth).

interface User {
  id: number;                    // ID unique
  username: string;               // Username unique (4-20 caractรจres)
  email: string;                  // Email unique
  passwordHash: string;           // Hash bcrypt (rounds: 10)
  role: 'user' | 'admin';        // Rรดle utilisateur
  twoFactorEnabled: boolean;      // 2FA activรฉe ?
  twoFactorSecret: string | null; // Secret TOTP (si 2FA activรฉe)
  createdAt: string;              // Date de crรฉation (ISO 8601)
  lastLogin: string | null;       // Dernier login (ISO 8601)
}

JWT Payload

Structure du payload JWT.

interface JWTPayload {
  sub: number;        // Subject (userId)
  username: string;   // Username
  role: string;       // Rรดle ('user' | 'admin')
  iat: number;        // Issued at (timestamp)
  exp: number;        // Expiration (timestamp)
}

Configuration JWT:

  • Algorithme: HS256
  • Expiration: 1h (configurable via AUTH_CONFIG.JWT_EXPIRATION)
  • Secret: Variable d'environnement JWT_SECRET
  • Validation: Locale au Gateway (pas d'appel au service Auth)

Rate Limits Summary

Endpoint Production Development
Gateway Global 1000/min 10000/min
Auth - Register 5/5min 100/5min
Auth - Login 5/5min 100/5min
Auth - 2FA Setup 5/5min 100/5min
Auth - 2FA Verify 5/5min 100/5min
Auth - Heartbeat 10/10s 10/10s
Auth - Is Online 200/min 1000/min
Admin - List Users 50/min 50/min
Admin - Update User 20/min 20/min
Admin - Delete User 10/min 10/min
Admin - Disable 2FA 10/min 10/min

Les rate limits s'adaptent automatiquement selon NODE_ENV (production/development/test).


๐Ÿ”— Liens utiles


๐Ÿ“ Notes importantes

Architecture

Gateway JWT Validation: Le Gateway valide les JWT localement sans appel au service Auth. Cela rรฉduit la latence et les points de dรฉfaillance.

Headers internes: Le Gateway injecte automatiquement les headers X-User-Id, X-User-Name et X-User-Role aprรจs validation du JWT pour toutes les requรชtes vers les services backend.

Sรฉcuritรฉ

Hashing: Tous les mots de passe sont hashรฉs avec bcrypt (10 rounds).

TOTP: Les tokens 2FA expirent aprรจs 30 secondes. Configuration standard : SHA1, 6 digits, 30s step.

Session Management: Le statut "en ligne" utilise Redis avec un TTL de 30 secondes. Les clients doivent envoyer un heartbeat toutes les 20-25 secondes.

Statuts HTTP

Les services utilisent les codes HTTP standardisรฉs :

  • 200 OK : Succรจs
  • 201 Created : Ressource crรฉรฉe
  • 400 Bad Request : Donnรฉes invalides
  • 401 Unauthorized : Authentification requise ou invalide
  • 403 Forbidden : Permissions insuffisantes
  • 404 Not Found : Ressource inexistante
  • 409 Conflict : Conflit (ex: username dรฉjร  pris)
  • 422 Unprocessable Entity : Erreur sรฉmantique
  • 429 Too Many Requests : Rate limit dรฉpassรฉ
  • 500 Internal Server Error : Erreur serveur

Voir Restful-API pour plus de dรฉtails sur les conventions HTTP.

๐Ÿ—๏ธ Architecture

๐ŸŒ Web Technologies

Backend

Frontend

๐Ÿ”ง Core Technologies

๐Ÿ” Security

โ›“๏ธ Blockchain

๐Ÿ› ๏ธ Dev Tools & Quality


๐Ÿ“ Page model

Clone this wiki locally