# 📚 Documentation API - Plateforme de Gestion de Commandes **Version:** 4.0.0 **Date:** 2025-01-18 **Base URL:** `http://localhost:8080` **Technologies:** Go, Gin, PostgreSQL, Redis, TomTom API --- ## 📋 Table des MatiĂšres 1. [Vue d'ensemble](#vue-densemble) 2. [Authentication](#authentication) 3. [API Client (v1)](#api-client-v1) 4. [API Admin (v2)](#api-admin-v2) 5. [API Cabine (v1)](#api-cabine-v1) 6. [API Livreur (v1)](#api-livreur-v1) 7. [Codes d'Erreur](#codes-derreur) --- ## 🎯 Vue d'ensemble Cette API REST complĂšte gĂšre une plateforme de livraison avec assignation automatique GPS des livreurs, suivi en temps rĂ©el, et systĂšme de pĂ©nalitĂ©s avancĂ©. ### ✹ FonctionnalitĂ©s Principales - **🔐 Authentication JWT** multi-rĂŽles (Client, Admin, Livreur, Cabine) - **🚗 Auto-assignation GPS** des livreurs les plus proches - **📍 Suivi temps rĂ©el** avec ETA et gĂ©olocalisation - **🔄 SystĂšme de queues** optimisĂ© pour les livraisons - **⚡ Workers automatiques** (nettoyage, assignation, notifications) - **🎯 SystĂšme de pĂ©nalitĂ©s** pour la gestion des comportements --- ## 🔐 Authentication ### Register Client **CrĂ©er un nouveau compte client** ```bash POST /api/v1/auth/register Content-Type: application/json ``` **RequĂȘte:** ```json { "username": "jean_dupont", "password": "SecurePass123!", "nom": "Dupont", "prenom": "Jean", "telephone": "+33612345678" } ``` **RĂ©ponse (201 Created):** ```json { "success": true, "message": "Client créé avec succĂšs", "client": { "id": 42, "username": "jean_dupont", "nom": "Dupont", "prenom": "Jean", "telephone": "+33612345678", "command": 0, "point": 0, "points_zipette": 0, "amende": 0.0, "cancellations_count": 0, "created_at": "2025-01-18T14:30:00Z" } } ``` **Erreurs possibles:** - `400` - DonnĂ©es invalides (validation Ă©chouĂ©e) - `409` - Username ou tĂ©lĂ©phone dĂ©jĂ  utilisĂ© --- ### Login Client **Se connecter et obtenir un token JWT** ```bash POST /api/v1/auth/login Content-Type: application/json ``` **RequĂȘte:** ```json { "username": "jean_dupont", "password": "SecurePass123!" } ``` **RĂ©ponse (200 OK):** ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 18000, "user": { "username": "jean_dupont", "role": "client" } } ``` **Erreurs possibles:** - `400` - DonnĂ©es manquantes - `401` - Identifiants incorrects --- ### Logout Client **Se dĂ©connecter (invalider le token)** ```bash POST /api/v1/auth/logout Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "DĂ©connexion rĂ©ussie" } ``` --- ## 🛒 API Client (v1) **Toutes les routes clients nĂ©cessitent le header:** ``` Authorization: Bearer ``` ### Produits (Public - Pas d'auth requis) #### Liste des produits ```bash GET /api/v1/products ``` **RĂ©ponse (200 OK):** ```json { "success": true, "products": [ { "id": 1, "nom": "Pizza Margherita", "description": "Pizza traditionnelle avec tomate, mozzarella et basilic", "category": "pizza", "stock": 50, "prix": 12.50, "prices": [ { "id": 1, "product_id": 1, "quantity": 1, "price": 12.50 } ], "media": [ { "id": 1, "product_id": 1, "type": "image", "url": "/uploads/pizza_margherita.jpg" } ], "created_at": "2025-01-18T00:00:00Z" } ], "total": 1 } ``` --- #### Produit par ID ```bash GET /api/v1/products/:id ``` **RĂ©ponse (200 OK):** ```json { "success": true, "product": { "id": 1, "nom": "Pizza Margherita", "description": "Pizza traditionnelle avec tomate, mozzarella et basilic", "category": "pizza", "stock": 50, "prix": 12.50, "prices": [...], "media": [...], "created_at": "2025-01-18T00:00:00Z" } } ``` **Erreurs possibles:** - `404` - Produit non trouvĂ© --- ### Gestion du Panier #### Ajouter au panier ```bash POST /api/v1/panier/add Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "name_product": "Pizza Margherita", "category": "pizza", "quantity": 2 } ``` **RĂ©ponse (201 Created):** ```json { "success": true, "message": "Produit ajoutĂ© au panier avec succĂšs", "panier": { "id": 15, "username": "jean_dupont", "name_product": "Pizza Margherita", "category": "pizza", "quantity": 2, "price": 25.00, "created_at": "2025-01-18T14:35:00Z" } } ``` **Erreurs possibles:** - `400` - DonnĂ©es invalides ou stock insuffisant - `401` - Non authentifiĂ© - `404` - Produit non trouvĂ© --- #### Voir mon panier ```bash GET /api/v1/panier/:username Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Panier rĂ©cupĂ©rĂ© avec succĂšs", "panier": [ { "id": 15, "username": "jean_dupont", "name_product": "Pizza Margherita", "category": "pizza", "quantity": 2, "price": 25.00, "created_at": "2025-01-18T14:35:00Z" } ], "count": 1, "total_amount": 25.00 } ``` **Erreurs possibles:** - `403` - AccĂšs au panier d'un autre utilisateur - `404` - Utilisateur non trouvĂ© --- #### Supprimer du panier ```bash DELETE /api/v1/panier/remove Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "id": 15 } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Produit supprimĂ© du panier avec succĂšs", "item_id": 15, "stock_released": true } ``` **Erreurs possibles:** - `403` - Tentative de supprimer l'article d'un autre utilisateur - `404` - Article non trouvĂ© --- #### Vider le panier ```bash DELETE /api/v1/panier/clear Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Panier vidĂ© avec succĂšs", "stock_released": 3 } ``` --- ### Commandes #### Valider le panier (Checkout avec Auto-assignation) ```bash POST /api/v1/checkout Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "delivery_address": "15 Rue de la Paix, 75002 Paris, France" } ``` **RĂ©ponse avec auto-assignation (200 OK):** ```json { "success": true, "message": "Commande créée et livreur assignĂ© automatiquement", "command_id": 1234, "delivery_address": "15 Rue de la Paix, 75002 Paris, France", "status": "assigned", "auto_assigned": true, "assigned_to": { "username": "john_deliveryman", "distance_km": 1.5, "travel_time": 8 } } ``` **RĂ©ponse sans auto-assignation (200 OK):** ```json { "success": true, "message": "Commande créée - En attente d'assignation", "command_id": 1234, "delivery_address": "15 Rue de la Paix, 75002 Paris, France", "status": "pending", "auto_assigned": false } ``` **Erreurs possibles:** - `400` - Panier vide ou adresse manquante - `401` - Non authentifiĂ© - `500` - Erreur crĂ©ation commande --- #### Mes commandes avec suivi ```bash GET /api/v1/my-commands Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "commands": [ { "id": 1234, "username": "jean_dupont", "status": "assigned", "total": 25.00, "delivery_address": "15 Rue de la Paix, 75002 Paris", "livreur_assign": "john_deliveryman", "created_at": "2025-01-18T14:40:00Z", "updated_at": "2025-01-18T14:42:00Z", "tracking": { "eta_minutes": 25, "estimated_arrival": "15:05", "deliveryman_status": "en_route", "queue_position": 2 } } ], "total": 1 } ``` --- #### Statut temps rĂ©el d'une commande ```bash GET /api/v1/commands/:id/status Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "command_id": 1234, "status": "en_route", "deliveryman": "john_deliveryman", "updated_at": "2025-01-18T15:20:00Z" } ``` **Statuts possibles:** - `pending` - En attente d'assignation - `assigned` - AssignĂ©e Ă  un livreur - `support` - Prise en charge par le livreur - `en_route` - Livreur en chemin - `arrived` - Livreur arrivĂ© - `livre` - LivrĂ©e (en attente d'approbation) - `approved` - ApprouvĂ©e par le client - `cancelled` - AnnulĂ©e - `failed` - Échec de livraison --- #### Suivi dĂ©taillĂ© avec ETA ```bash GET /api/v1/commands/:id/tracking Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "command_id": 1234, "status": "en_route", "deliveryman": "john_deliveryman", "eta": { "minutes": 22, "estimated_arrival": "15:02", "arrival_time_unix": 1705669320, "updated_at": "2025-01-18T14:40:00Z" }, "queue_position": 2, "total_queue_size": 5 } ``` --- #### ETA de livraison ```bash GET /api/v1/commands/:id/eta Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "command_id": 1234, "eta_minutes": 22, "estimated_arrival": "15:02:00", "queue_position": 2, "updated_at": "2025-01-18T14:40:00Z" } ``` --- #### Approuver une livraison ```bash POST /api/v1/commands/:id/approve Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "rating": 5, "comment": "Excellent service, livreur trĂšs professionnel !" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Livraison approuvĂ©e avec succĂšs", "command_id": 1234, "status": "approved", "rating": { "deliveryman": "john_deliveryman", "rating": 5, "comment": "Excellent service, livreur trĂšs professionnel !", "created_at": "2025-01-18T15:05:00Z" } } ``` --- #### Annuler une commande ```bash POST /api/v1/commands/:id/cancel Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "reason": "Changement de plans" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Commande annulĂ©e avec succĂšs", "command_id": 1234, "penalty_applied": true, "penalty_details": { "cancellations_count": 1, "penalty_amount": 20.0, "warning": "PĂ©nalitĂ© appliquĂ©e pour annulation" } } ``` --- ### Profil et Historique #### Mettre Ă  jour mon profil ```bash PUT /api/v1/profile/update Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "nom": "Nouveau Nom", "prenom": "Nouveau PrĂ©nom", "telephone": "+33687654321", "password": "NewSecurePass456!" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Profil mis Ă  jour avec succĂšs", "client": { "id": 42, "username": "jean_dupont", "nom": "Nouveau Nom", "prenom": "Nouveau PrĂ©nom", "telephone": "+33687654321", "updated_at": "2025-01-18T15:30:00Z" } } ``` --- #### Mes pĂ©nalitĂ©s ```bash GET /api/v1/penalties Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "client": { "username": "jean_dupont", "amende": 20.0, "cancellations_count": 1, "last_penalty_reason": "Annulation tardive" }, "penalty_scale": { "1st": 20.0, "2nd": 50.0, "3rd": 100.0, "4th+": 150.0 }, "next_penalty": 50.0, "warning": "La prochaine annulation entraĂźnera une pĂ©nalitĂ© de 50 points" } ``` --- ## đŸ‘šâ€đŸ’Œ API Admin (v2) **Toutes les routes admin nĂ©cessitent le header:** ``` Authorization: Bearer ``` ### Authentication Admin #### Login Admin ```bash POST /api/v2/admin/auth/login Content-Type: application/json ``` **RequĂȘte:** ```json { "username": "admin_master", "password": "AdminSecure123!" } ``` **RĂ©ponse (200 OK):** ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 7200, "user": { "username": "admin_master", "role": "admin" } } ``` --- ### Gestion des Commandes #### Liste des commandes ```bash GET /api/v2/admin/protected/orders Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "orders": [ { "id": 1234, "username": "jean_dupont", "status": "assigned", "total": 25.00, "delivery_address": "15 Rue de la Paix, 75002 Paris", "livreur_assign": "john_deliveryman", "dest_latitude": 48.8698, "dest_longitude": 2.3311, "created_at": "2025-01-18T14:40:00Z", "updated_at": "2025-01-18T14:42:00Z" } ], "total": 1 } ``` --- #### Assignation automatique GPS ```bash POST /api/v2/admin/protected/orders/:id/auto-assign Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Commande assignĂ©e automatiquement", "command_id": 1234, "assigned_to": "john_deliveryman", "distance": { "km": 1.5, "eta_minutes": 8 }, "queue_position": 3 } ``` **Erreurs possibles:** - `404` - Commande non trouvĂ©e - `400` - Aucun livreur disponible - `409` - Commande dĂ©jĂ  assignĂ©e --- #### Assigner toutes les commandes en attente ```bash POST /api/v2/admin/protected/orders/auto-assign-all Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Auto-assignation effectuĂ©e", "assigned_count": 5, "failed_count": 0, "details": [ { "command_id": 1234, "assigned_to": "john_deliveryman", "distance_km": 1.5, "eta_minutes": 8 } ] } ``` --- ### Gestion des Livreurs #### Livreurs disponibles ```bash GET /api/v2/admin/protected/delivery-persons Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "delivery_persons": [ { "username": "john_deliveryman", "status": "available", "current_command": 0, "queue_size": 2, "location": { "latitude": 48.8566, "longitude": 2.3522, "last_update": "2025-01-18T16:30:00Z" } } ], "total": 1 } ``` --- #### Position d'un livreur ```bash GET /api/v2/admin/protected/delivery-persons/:username/location Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "deliveryman": "john_deliveryman", "location": { "latitude": 48.8566, "longitude": 2.3522, "last_update": "2025-01-18T16:25:00Z" }, "status": "available" } ``` --- #### Queues des livreurs ```bash GET /api/v2/admin/protected/delivery/queues Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "queues": { "john_deliveryman": { "queue_size": 3, "commands": [1234, 1235, 1236], "can_accept_more": true, "capacity": "3/10", "status": "available" } }, "total_pending": 3 } ``` --- ### Gestion des Produits #### CrĂ©er un produit ```bash POST /api/v2/admin/protected/products Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "nom": "Pizza Pepperoni", "category": "pizza", "description": "Pizza avec pepperoni et mozzarella", "stock": 30, "prix": 14.50 } ``` **RĂ©ponse (201 Created):** ```json { "success": true, "message": "Produit créé avec succĂšs", "product": { "id": 10, "nom": "Pizza Pepperoni", "category": "pizza", "description": "Pizza avec pepperoni et mozzarella", "stock": 30, "prix": 14.50, "created_at": "2025-01-18T16:10:00Z" } } ``` --- ### SystĂšme de PĂ©nalitĂ©s #### Appliquer une pĂ©nalitĂ© ```bash POST /api/v2/admin/protected/penalty Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "username": "jean_dupont", "amount": 50.0, "reason": "Comportement inappropriĂ©" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "PĂ©nalitĂ© appliquĂ©e", "client": "jean_dupont", "penalty": { "amount": 50.0, "reason": "Comportement inappropriĂ©", "applied_at": "2025-01-18T17:00:00Z" }, "total_amende": 70.0 } ``` --- ## đŸȘ API Cabine (v1) **Toutes les routes cabine nĂ©cessitent le header:** ``` Authorization: Bearer ``` #### Articles d'une commande ```bash GET /api/v1/cabine/commands/:id/items Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "command_id": 1234, "items": [ { "id": 1, "command_id": 1234, "produit": "Pizza Margherita", "quantite": 2, "prix": 25.0, "status": "pending", "category": "pizza" } ], "total": 1 } ``` --- #### Modifier le statut d'un article ```bash PUT /api/v1/cabine/items/:item_id/status Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "status": "prepared" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Statut mis Ă  jour", "item": { "id": 1, "command_id": 1234, "status": "prepared", "updated_at": "2025-01-18T17:15:00Z" } } ``` **Statuts disponibles:** `pending`, `prepared`, `packed`, `ready` --- ## 🚚 API Livreur (v1) **Toutes les routes livreur nĂ©cessitent le header:** ``` Authorization: Bearer ``` ### Livraisons #### Mes livraisons (donnĂ©es filtrĂ©es) ```bash GET /api/v1/livreur/deliveries Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "deliveries": [ { "id": 1234, "status": "assigned", "adresse": "15 Rue de la Paix, 75002 Paris", "total_prix": 25.0, "created_at": "2025-01-18T14:40:00Z", "client_info": { "nom": "Dupont", "prenom": "Jean" }, "items": [ { "produit": "Pizza Margherita", "quantite": 2, "prix": 25.0 } ], "items_count": 1, "eta": { "minutes": 25, "estimated_arrival": "15:05" } } ], "count": 1 } ``` **Note:** Les donnĂ©es sensibles comme le tĂ©lĂ©phone client sont filtrĂ©es pour les livreurs. --- #### Mettre Ă  jour le statut d'une livraison ```bash PUT /api/v1/livreur/deliveries/:id/status Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "status": "en_route", "notes": "En route vers le client", "latitude": 48.8566, "longitude": 2.3522 } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Statut mis Ă  jour", "command_id": 1234, "status": "en_route", "eta_minutes": 15, "eta_message": "ArrivĂ©e prĂ©vue dans 15 minutes" } ``` **Statuts valides pour livreur:** - `support` - Prise en charge - `assigned` - AssignĂ© - `en_route` - En route vers le client - `arrived` - ArrivĂ© Ă  destination - `livre` - LivrĂ© - `failed` - Échec de livraison - `cancelled` - AnnulĂ©e --- ### Position GPS #### Mettre Ă  jour ma position ```bash POST /api/v1/livreur/location/update Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "latitude": 48.8566, "longitude": 2.3522 } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Position mise Ă  jour", "location": { "latitude": 48.8566, "longitude": 2.3522, "updated_at": "2025-01-18T17:35:00Z" } } ``` --- #### Ma position actuelle ```bash GET /api/v1/livreur/location Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "location": { "latitude": 48.8566, "longitude": 2.3522, "last_update": "2025-01-18T17:35:00Z" } } ``` --- ### Statut et Queue #### Mettre Ă  jour mon statut ```bash POST /api/v1/livreur/update/status Authorization: Bearer Content-Type: application/json ``` **RequĂȘte:** ```json { "status": "available" } ``` **RĂ©ponse (200 OK):** ```json { "success": true, "message": "Statut mis Ă  jour", "status": { "username": "john_deliveryman", "status": "available", "updated_at": "2025-01-18T17:40:00Z" } } ``` **Statuts disponibles:** `available`, `busy`, `offline` --- #### Ma queue de livraisons ```bash GET /api/v1/livreur/queue Authorization: Bearer ``` **RĂ©ponse (200 OK):** ```json { "success": true, "deliveryman": "john_deliveryman", "queue_size": 3, "commands": [ { "position": 1, "command_id": 1234, "address": "15 Rue de la Paix, 75002 Paris", "estimated_eta": 12, "total_prix": 25.0 } ] } ``` --- ## ❌ Codes d'Erreur ### Erreurs HTTP Standards | Code | Signification | Description | |------|---------------|-------------| | 200 | OK | SuccĂšs | | 201 | Created | Ressource créée | | 400 | Bad Request | DonnĂ©es invalides | | 401 | Unauthorized | Non authentifiĂ© | | 403 | Forbidden | Non autorisĂ© | | 404 | Not Found | Ressource introuvable | | 409 | Conflict | Conflit (username dĂ©jĂ  pris) | | 422 | Unprocessable Entity | Validation Ă©chouĂ©e | | 500 | Internal Server Error | Erreur serveur | ### Exemples d'Erreurs #### 400 - Bad Request ```json { "error": "DonnĂ©es invalides", "details": "Le champ 'username' est requis" } ``` #### 401 - Unauthorized ```json { "error": "Token invalide ou expirĂ©", "message": "Veuillez vous reconnecter" } ``` #### 403 - Forbidden ```json { "error": "AccĂšs refusĂ©", "message": "Vous n'avez pas les permissions nĂ©cessaires" } ``` #### 404 - Not Found ```json { "error": "Ressource introuvable", "message": "Commande avec l'ID 9999 introuvable" } ``` #### 409 - Conflict ```json { "error": "Conflit", "message": "Ce nom d'utilisateur est dĂ©jĂ  pris" } ``` #### 422 - Unprocessable Entity ```json { "error": "Validation Ă©chouĂ©e", "details": { "field": "telephone", "message": "Format de tĂ©lĂ©phone invalide" } } ``` #### 500 - Internal Server Error ```json { "error": "Erreur serveur interne", "message": "Une erreur inattendue s'est produite" } ``` --- ## 📝 Notes Importantes ### SĂ©curitĂ© - **Tokens JWT** : Expiration variable selon le rĂŽle (Client: 5h, Admin: 2h) - **Validation GPS** : Requis pour certaines actions de livraison - **Filtrage des donnĂ©es** : Les livreurs n'ont pas accĂšs aux tĂ©lĂ©phones clients - **Rate Limiting** : Protection contre les abus ### Format des DonnĂ©es - **Dates** : Format ISO 8601 (`2025-01-18T14:30:00Z`) - **CoordonnĂ©es** : Latitude/Longitude en dĂ©cimal (WGS84) - **Prix** : En euros avec 2 dĂ©cimales - **TĂ©lĂ©phones** : Format international (`+33612345678`) ### Workers Automatiques - **Auto-Assignment Cron** : Toutes les 5 minutes - **Queue Cleanup** : Toutes les 5 minutes - **ETA Updates** : Toutes les 30 secondes - **Stock Cleanup** : Toutes les 5 minutes ### FonctionnalitĂ©s AvancĂ©es - **Assignation GPS automatique** au checkout - **Calcul ETA temps rĂ©el** avec TomTom API - **SystĂšme de queues optimisĂ©** pour les livreurs - **Nettoyage automatique** des commandes invalides - **Notifications temps rĂ©el** via Redis Pub/Sub --- **Documentation gĂ©nĂ©rĂ©e le :** 2025-01-18 **Version API :** 4.0.0 **Technologies :** Go, Gin, PostgreSQL, Redis, TomTom API **Support :** DĂ©veloppĂ© avec ❀ en Go