# Task 3 Complete: API REST de Base ## Date 2 décembre 2024 ## Résumé Implémentation complète de l'API REST pour le Visual Workflow Builder avec endpoints CRUD, validation JSON, gestion d'erreurs et tests automatisés. ## Fichiers Créés/Modifiés ### Nouveaux Fichiers 1. **visual_workflow_builder/backend/api/errors.py** - Classes d'exceptions personnalisées (APIError, ValidationError, NotFoundError, etc.) - Fonction `error_response()` pour formater les réponses d'erreur - Classe `ErrorCode` avec codes d'erreur standardisés - Messages d'erreur localisés 2. **visual_workflow_builder/backend/api/validation.py** - Fonctions de validation pour les requêtes API - `validate_workflow_data()` - Validation complète des workflows - `validate_update_data()` - Validation des mises à jour - `validate_node_data()` - Validation des nodes - `validate_edge_data()` - Validation des edges - `validate_variable_data()` - Validation des variables - `validate_settings_data()` - Validation des paramètres 3. **visual_workflow_builder/backend/test_api_manual.py** - Suite de tests automatisés pour l'API - Tests CRUD complets - Tests de validation - Tests de gestion d'erreurs - Tests de filtrage ### Fichiers Modifiés 1. **visual_workflow_builder/backend/api/workflows.py** - Implémentation complète des endpoints CRUD - GET `/api/workflows/` - Liste des workflows avec filtres - POST `/api/workflows/` - Création de workflow - GET `/api/workflows/` - Récupération d'un workflow - PUT `/api/workflows/` - Mise à jour d'un workflow - DELETE `/api/workflows/` - Suppression d'un workflow - POST `/api/workflows//validate` - Validation d'un workflow - Stockage en mémoire (sera remplacé par DB en Phase 4) 2. **visual_workflow_builder/backend/api/__init__.py** - Exports de tous les modules API - Point d'entrée centralisé 3. **visual_workflow_builder/backend/app.py** - Enregistrement du blueprint workflows - Gestionnaires d'erreurs globaux (404, 405, 500) - Gestion des exceptions non capturées ## Fonctionnalités Implémentées ### 1. Endpoints CRUD Complets #### GET /api/workflows/ - Liste tous les workflows - Filtres disponibles: - `category` - Filtrer par catégorie - `is_template` - Filtrer les templates (true/false) - `tags` - Filtrer par tags (séparés par virgules) - Retourne un tableau JSON de workflows #### POST /api/workflows/ - Crée un nouveau workflow - Génère automatiquement un ID unique (UUID) - Ajoute les timestamps (created_at, updated_at) - Valide les données avant création - Retourne le workflow créé avec code 201 #### GET /api/workflows/ - Récupère un workflow spécifique par ID - Retourne 404 si non trouvé - Retourne le workflow complet en JSON #### PUT /api/workflows/ - Met à jour un workflow existant - Supporte les mises à jour partielles - Met à jour automatiquement le timestamp updated_at - Valide les données avant mise à jour - Retourne le workflow mis à jour #### DELETE /api/workflows/ - Supprime un workflow - Retourne 204 (No Content) en cas de succès - Retourne 404 si le workflow n'existe pas #### POST /api/workflows//validate - Valide la structure d'un workflow - Retourne: - `is_valid` - Boolean indiquant si le workflow est valide - `errors` - Liste des erreurs critiques - `warnings` - Liste des avertissements (ex: nodes déconnectés) ### 2. Validation des Données #### Validation des Workflows - Champs requis: `name`, `created_by` - Validation des types de données - Validation de la structure des nodes et edges - Validation des variables (unicité des noms) - Validation des paramètres #### Validation des Nodes - Champs requis: `id`, `type`, `position`, `size`, `parameters`, `input_ports`, `output_ports` - Validation de la position (x, y doivent être des nombres) - Validation de la taille (width, height doivent être des nombres) - Validation des ports #### Validation des Edges - Champs requis: `id`, `source`, `target`, `source_port`, `target_port` - Tous les champs doivent être des chaînes non vides #### Validation des Variables - Champs requis: `name`, `type`, `value` - Types valides: `string`, `number`, `boolean`, `object` ### 3. Gestion des Erreurs #### Codes d'Erreur HTTP - **200** - Succès - **201** - Créé - **204** - Pas de contenu (suppression réussie) - **400** - Requête invalide (validation échouée) - **404** - Ressource non trouvée - **405** - Méthode non autorisée - **500** - Erreur serveur interne #### Format des Réponses d'Erreur ```json { "error": { "code": 400, "message": "Description de l'erreur", "details": {} // Optionnel } } ``` #### Codes d'Erreur Personnalisés - **1000-1999**: Erreurs de validation - **2000-2999**: Erreurs de sérialisation - **3000-3999**: Erreurs d'exécution - **4000-4999**: Erreurs réseau - **5000-5999**: Erreurs de ressources ### 4. Stockage en Mémoire - Dictionnaire Python pour stocker les workflows - Clé: workflow_id (UUID) - Valeur: objet VisualWorkflow - Sera remplacé par une base de données en Phase 4 ## Tests Exécutés ### Suite de Tests Automatisés (✓ Tous passent) ``` ✓ test_health_check ✓ test_list_workflows_empty ✓ test_create_workflow ✓ test_get_workflow ✓ test_update_workflow ✓ test_validate_workflow ✓ test_create_workflow_with_nodes ✓ test_list_workflows_with_filters ✓ test_delete_workflow (x2) ✓ test_error_handling - 404 error - Validation error - Missing body error ``` ### Résultats ``` ============================================================ ✓ ALL TESTS PASSED! ============================================================ ``` ## Exemples d'Utilisation ### Créer un Workflow ```bash curl -X POST http://localhost:5001/api/workflows/ \ -H "Content-Type: application/json" \ -d '{ "name": "Mon Workflow", "description": "Description", "created_by": "user123", "nodes": [], "edges": [], "variables": [] }' ``` ### Lister les Workflows ```bash curl http://localhost:5001/api/workflows/ ``` ### Filtrer par Tags ```bash curl http://localhost:5001/api/workflows/?tags=test,demo ``` ### Récupérer un Workflow ```bash curl http://localhost:5001/api/workflows/ ``` ### Mettre à Jour un Workflow ```bash curl -X PUT http://localhost:5001/api/workflows/ \ -H "Content-Type: application/json" \ -d '{ "name": "Nouveau Nom", "description": "Nouvelle description" }' ``` ### Valider un Workflow ```bash curl -X POST http://localhost:5001/api/workflows//validate ``` ### Supprimer un Workflow ```bash curl -X DELETE http://localhost:5001/api/workflows/ ``` ## Exigences Validées - ✅ **Exigence 5.1**: Endpoints CRUD pour workflows - ✅ **Exigence 5.2**: Sérialisation/désérialisation JSON - ✅ **Exigence 5.3**: Validation des requêtes - ✅ **Exigence 5.5**: Gestion d'erreurs et codes d'erreur ## Prochaines Étapes La tâche 4 peut maintenant commencer: **Checkpoint - Vérifier que les tests passent** Ensuite, Phase 2 commencera avec: - Tâche 5: Implémenter le composant Canvas - Tâche 6: Implémenter la gestion des edges - Tâche 7: Créer la palette de nodes ## Notes Techniques ### Choix de Design 1. **Stockage en Mémoire**: Utilisé pour la Phase 1, sera remplacé par SQLite/PostgreSQL 2. **Validation en Deux Étapes**: - Validation des données de requête (validation.py) - Validation de la structure du workflow (models.validate()) 3. **Gestion d'Erreurs Centralisée**: Toutes les erreurs passent par error_response() 4. **Codes d'Erreur Standardisés**: Facilite le debugging et l'intégration frontend ### Points d'Attention - Le stockage en mémoire est volatile (données perdues au redémarrage) - Les endpoints execute, export, import sont des placeholders pour les phases futures - CORS est configuré pour accepter localhost:3000 (frontend React) - Le serveur utilise le port 5001 (5000 était en conflit) ## Statistiques - **Fichiers créés**: 3 - **Fichiers modifiés**: 3 - **Lignes de code Python**: ~900 - **Endpoints implémentés**: 9 - **Tests automatisés**: 11 - **Taux de réussite des tests**: 100% ## Intégration ### Backend ↔ Models - ✅ Utilisation complète des modèles de données - ✅ Sérialisation/désérialisation automatique - ✅ Validation intégrée ### API ↔ Frontend (Prêt) - ✅ Format JSON standardisé - ✅ Codes d'erreur clairs - ✅ CORS configuré - ✅ Documentation des endpoints ### Prochaine Intégration - Phase 4: Base de données (SQLite/PostgreSQL) - Phase 5: Conversion vers WorkflowGraph - Phase 6: WebSocket pour temps réel