# 🌐 Documentation API ## Vue d'ensemble L'API PtitsPas est une API REST construite avec **NestJS**. **URL de base** : `https://app.ptits-pas.fr/api/v1` **Format** : JSON **Authentication** : JWT Bearer Token --- ## Authentication Toutes les routes (sauf `/auth/login`, `/auth/register`, `/auth/refresh`) nécessitent un token JWT dans le header : ```http Authorization: Bearer ``` ### Tokens L'API utilise deux types de tokens : - **Access Token** : Durée de vie courte, utilisé pour les requêtes API - **Refresh Token** : Durée de vie longue, utilisé pour renouveler l'access token --- ## Endpoints ### 🔐 Authentification (`/auth`) #### POST `/auth/login` Connexion d'un utilisateur. **Public** : ✅ Oui **Request Body** : ```json { "email": "admin@ptits-pas.fr", "password": "4dm1n1strateur" } ``` **Response** (200) : ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": "uuid", "email": "admin@ptits-pas.fr", "role": "super_admin", "prenom": "Admin", "nom": "Système" } } ``` **Errors** : - `401` : Email ou mot de passe incorrect - `403` : Compte suspendu ou en attente de validation --- #### POST `/auth/register` Inscription d'un nouvel utilisateur (parent ou assistante maternelle). **Public** : ✅ Oui **Request Body** : ```json { "email": "parent@example.com", "password": "motdepasse123", "prenom": "Jean", "nom": "Dupont", "role": "parent", "telephone": "0601020304" } ``` **Response** (201) : ```json { "message": "Inscription réussie. Votre compte est en attente de validation.", "userId": "uuid" } ``` **Errors** : - `409` : Email déjà utilisé - `400` : Données invalides --- #### POST `/auth/refresh` Rafraîchir l'access token à l'aide du refresh token. **Public** : ✅ Oui **Request Body** : ```json { "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } ``` **Response** (200) : ```json { "access_token": "nouveau_token...", "refresh_token": "nouveau_refresh_token..." } ``` **Errors** : - `401` : Token de rafraîchissement invalide ou expiré --- #### GET `/auth/me` Récupérer le profil de l'utilisateur connecté. **Auth** : 🔒 Requis **Response** (200) : ```json { "id": "uuid", "email": "admin@ptits-pas.fr", "role": "super_admin", "prenom": "Admin", "nom": "Système", "statut": "actif" } ``` --- #### POST `/auth/logout` Déconnexion (invalide le refresh token). **Auth** : 🔒 Requis **Response** (200) : ```json { "message": "Déconnexion réussie" } ``` --- ### 👥 Utilisateurs (`/users`) **Auth** : 🔒 Requis pour toutes les routes #### GET `/users` Liste tous les utilisateurs. **Rôles autorisés** : `super_admin` **Response** (200) : ```json [ { "id": "uuid", "email": "user@example.com", "role": "parent", "prenom": "Jean", "nom": "Dupont", "statut": "actif", "cree_le": "2025-01-15T10:30:00Z" } ] ``` --- #### GET `/users/:id` Récupérer un utilisateur par son ID. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json { "id": "uuid", "email": "user@example.com", "role": "parent", "prenom": "Jean", "nom": "Dupont", "telephone": "0601020304", "statut": "actif" } ``` **Errors** : - `404` : Utilisateur non trouvé - `403` : Accès refusé --- #### POST `/users` Créer un nouvel utilisateur. **Rôles autorisés** : `super_admin` **Request Body** : ```json { "email": "newuser@example.com", "password": "password123", "role": "gestionnaire", "prenom": "Marie", "nom": "Martin" } ``` **Response** (201) : ```json { "id": "uuid", "email": "newuser@example.com", "role": "gestionnaire" } ``` --- #### PATCH `/users/:id` Mettre à jour un utilisateur. **Rôles autorisés** : `super_admin` **Request Body** (tous les champs sont optionnels) : ```json { "prenom": "Jean-Claude", "telephone": "0612345678", "adresse": "1 rue de la Paix, 75001 Paris" } ``` **Response** (200) : ```json { "id": "uuid", "email": "user@example.com", "prenom": "Jean-Claude", "telephone": "0612345678" } ``` --- #### PATCH `/users/:id/valider` Valider un compte utilisateur en attente. **Rôles autorisés** : `super_admin`, `gestionnaire`, `administrateur` **Request Body** : ```json { "comment": "Compte validé après vérification des documents" } ``` **Response** (200) : ```json { "message": "Compte validé avec succès", "userId": "uuid" } ``` --- #### PATCH `/users/:id/suspendre` Suspendre un compte utilisateur. **Rôles autorisés** : `super_admin`, `gestionnaire`, `administrateur` **Request Body** : ```json { "comment": "Compte suspendu pour non-respect des conditions" } ``` **Response** (200) : ```json { "message": "Compte suspendu", "userId": "uuid" } ``` --- #### DELETE `/users/:id` Supprimer un utilisateur. **Rôles autorisés** : `super_admin` **Response** (200) : ```json { "message": "Utilisateur supprimé" } ``` --- ### 🏢 Gestionnaires (`/gestionnaires`) **Auth** : 🔒 Requis pour toutes les routes #### GET `/gestionnaires` Liste tous les gestionnaires. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json [ { "id": "uuid", "email": "gestionnaire@ptits-pas.fr", "role": "gestionnaire", "prenom": "Sophie", "nom": "Leroy" } ] ``` --- #### GET `/gestionnaires/:id` Récupérer un gestionnaire par son ID. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : Identique à `/users/:id` --- #### POST `/gestionnaires` Créer un nouveau gestionnaire. **Rôles autorisés** : `super_admin` **Request Body** : ```json { "email": "nouveau.gestionnaire@ptits-pas.fr", "password": "password123", "prenom": "Laurent", "nom": "Bernard" } ``` **Response** (201) : ```json { "id": "uuid", "email": "nouveau.gestionnaire@ptits-pas.fr", "role": "gestionnaire" } ``` --- #### PATCH `/gestionnaires/:id` Mettre à jour un gestionnaire. **Rôles autorisés** : `super_admin` **Request Body** : Identique à `/users/:id` (PATCH) --- ### 👶 Parents (`/parents`) **Auth** : 🔒 Requis pour toutes les routes #### GET `/parents` Liste tous les parents. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json [ { "id_utilisateur": "uuid", "id_co_parent": "uuid", "utilisateur": { "email": "parent@example.com", "prenom": "Jean", "nom": "Dupont" } } ] ``` --- #### GET `/parents/:id` Récupérer un parent par son ID utilisateur. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json { "id_utilisateur": "uuid", "id_co_parent": "uuid", "utilisateur": { "email": "parent@example.com", "prenom": "Jean", "nom": "Dupont", "telephone": "0601020304" } } ``` --- #### POST `/parents` Créer un nouveau parent. **Rôles autorisés** : `super_admin`, `gestionnaire` **Request Body** : ```json { "email": "parent@example.com", "password": "password123", "prenom": "Jean", "nom": "Dupont", "telephone": "0601020304", "id_co_parent": "uuid" // optionnel } ``` **Response** (201) : Identique à GET --- #### PATCH `/parents/:id` Mettre à jour un parent. **Rôles autorisés** : `super_admin`, `gestionnaire` **Request Body** : ```json { "id_co_parent": "uuid", "telephone": "0612345678" } ``` --- ### 👧 Enfants (`/enfants`) **Auth** : 🔒 Requis pour toutes les routes #### GET `/enfants` Liste tous les enfants. **Rôles autorisés** : `super_admin`, `gestionnaire`, `administrateur` **Response** (200) : ```json [ { "id": "uuid", "prenom": "Alice", "nom": "Dupont", "genre": "F", "date_naissance": "2020-05-15", "statut": "actif" } ] ``` --- #### GET `/enfants/:id` Récupérer un enfant par son ID. **Rôles autorisés** : `super_admin`, `gestionnaire`, `administrateur`, `parent` (si c'est son enfant) **Response** (200) : ```json { "id": "uuid", "prenom": "Alice", "nom": "Dupont", "genre": "F", "date_naissance": "2020-05-15", "statut": "actif", "consentement_photo": false } ``` --- #### POST `/enfants` Créer un nouvel enfant. **Rôles autorisés** : `parent` **Request Body** : ```json { "prenom": "Alice", "nom": "Dupont", "genre": "F", "date_naissance": "2020-05-15", "statut": "actif" } ``` **Response** (201) : Identique à GET --- #### PATCH `/enfants/:id` Mettre à jour un enfant. **Rôles autorisés** : `super_admin`, `administrateur`, `parent` (si c'est son enfant) **Request Body** : ```json { "statut": "scolarise", "consentement_photo": true } ``` --- #### DELETE `/enfants/:id` Supprimer un enfant. **Rôles autorisés** : `super_admin` **Response** (200) : ```json { "message": "Enfant supprimé" } ``` --- ### 👩‍🍼 Assistantes Maternelles (`/assistantes-maternelles`) **Auth** : 🔒 Requis pour toutes les routes #### GET `/assistantes-maternelles` Liste toutes les assistantes maternelles. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json [ { "id_utilisateur": "uuid", "numero_agrement": "AM123456", "nb_max_enfants": 4, "place_disponible": 2, "disponible": true, "utilisateur": { "email": "am@example.com", "prenom": "Marie", "nom": "Martin" } } ] ``` --- #### GET `/assistantes-maternelles/:id` Récupérer une assistante maternelle par son ID utilisateur. **Rôles autorisés** : `super_admin`, `gestionnaire` **Response** (200) : ```json { "id_utilisateur": "uuid", "numero_agrement": "AM123456", "nir_chiffre": "123456789012345", "nb_max_enfants": 4, "place_disponible": 2, "biographie": "Assistante maternelle depuis 10 ans...", "disponible": true, "ville_residence": "Paris", "date_agrement": "2015-06-01", "annee_experience": 10, "specialite": "Pédagogie Montessori" } ``` --- #### POST `/assistantes-maternelles` Créer une nouvelle assistante maternelle. **Rôles autorisés** : `super_admin`, `gestionnaire` **Request Body** : ```json { "email": "am@example.com", "password": "password123", "prenom": "Marie", "nom": "Martin", "numero_agrement": "AM123456", "nb_max_enfants": 4, "ville_residence": "Paris" } ``` **Response** (201) : Identique à GET --- #### PATCH `/assistantes-maternelles/:id` Mettre à jour une assistante maternelle. **Rôles autorisés** : `super_admin`, `gestionnaire` **Request Body** : ```json { "place_disponible": 1, "disponible": true, "biographie": "Nouvelle bio..." } ``` --- #### DELETE `/assistantes-maternelles/:id` Supprimer une assistante maternelle. **Rôles autorisés** : `super_admin`, `gestionnaire`, `administrateur` **Response** (200) : ```json { "message": "Assistante maternelle supprimée" } ``` --- ### 🏠 Root (`/`) #### GET `/` Aperçu de l'API. **Public** : ✅ Oui **Response** (200) : ```json { "message": "Bienvenue sur l'API PtitsPas", "version": "1.0.0", "endpoints": { "auth": "/api/v1/auth", "users": "/api/v1/users", "parents": "/api/v1/parents", "enfants": "/api/v1/enfants", "assistantes-maternelles": "/api/v1/assistantes-maternelles", "gestionnaires": "/api/v1/gestionnaires" } } ``` --- #### GET `/hello` Endpoint de test. **Public** : ✅ Oui **Response** (200) : ```text Hello World! ``` --- ## Codes d'erreur HTTP | Code | Signification | Explication | |------|---------------|-------------| | `200` | OK | Requête réussie | | `201` | Created | Ressource créée | | `400` | Bad Request | Données invalides | | `401` | Unauthorized | Non authentifié ou token invalide | | `403` | Forbidden | Accès refusé (rôle insuffisant) | | `404` | Not Found | Ressource non trouvée | | `409` | Conflict | Conflit (ex: email déjà existant) | | `500` | Internal Server Error | Erreur serveur | --- ## Format des réponses d'erreur ```json { "statusCode": 400, "message": "Validation failed", "error": "Bad Request" } ``` Ou avec détails : ```json { "statusCode": 403, "message": "Accès refusé : rôle insuffisant", "error": "Forbidden" } ``` --- ## Authentification et Rôles ### Hiérarchie des rôles 1. **super_admin** : Accès total 2. **administrateur** : Gestion des utilisateurs 3. **gestionnaire** : Gestion des dossiers et validation 4. **assistante_maternelle** : Accès à ses propres données 5. **parent** : Accès à ses propres données et enfants ### Guards L'API utilise deux guards : - **AuthGuard** : Vérifie la validité du token JWT - **RolesGuard** : Vérifie que l'utilisateur a le bon rôle ### Décorateurs - `@Public()` : Route accessible sans authentification - `@Roles(...roles)` : Restreint l'accès aux rôles spécifiés - `@User()` : Injecte l'utilisateur connecté dans le contrôleur --- ## Swagger / OpenAPI L'API expose automatiquement sa documentation Swagger : **URL** : `https://app.ptits-pas.fr/api/docs` Cette documentation interactive permet de : - Visualiser tous les endpoints - Tester les requêtes directement - Voir les schémas de données --- ## Exemples d'utilisation ### Connexion et récupération du profil ```bash # 1. Login curl -X POST https://app.ptits-pas.fr/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@ptits-pas.fr","password":"4dm1n1strateur"}' # Response { "access_token": "eyJhbGc...", "refresh_token": "eyJhbGc..." } # 2. Récupérer son profil curl https://app.ptits-pas.fr/api/v1/auth/me \ -H "Authorization: Bearer eyJhbGc..." ``` ### Créer un parent ```bash curl -X POST https://app.ptits-pas.fr/api/v1/parents \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "email": "parent@example.com", "password": "password123", "prenom": "Jean", "nom": "Dupont", "telephone": "0601020304" }' ``` --- ## Limitations et Rate Limiting **Actuellement** : Aucune limitation n'est active. **À implémenter** : - Rate limiting (ex: 100 requêtes/minute) - Pagination pour les listes longues - Filtrage et tri sur les endpoints de liste --- ## Évolutions prévues - [ ] Endpoints pour les dossiers (`/dossiers`) - [ ] Endpoints pour les contrats (`/contrats`) - [ ] Endpoints pour les événements (`/evenements`) - [ ] Endpoints pour les messages (`/messages`) - [ ] Endpoints pour les notifications (`/notifications`) - [ ] WebSocket pour les notifications en temps réel - [ ] Upload de fichiers (`/uploads`) - [ ] Génération de PDF (contrats) --- **Dernière mise à jour** : Novembre 2025