Skip to main content
Glama
WorkflowValidatorToolInterface.ts8.69 kB
import express from 'express'; import WorkflowValidatorTool from './WorkflowValidatorTool.js'; import fs from 'fs'; import path from 'path'; /** * Interface pour l'outil de validation des workflows * Expose les fonctionnalités de l'outil via une API REST */ export class WorkflowValidatorToolInterface { private tool: WorkflowValidatorTool; private outputBaseDir: string; // Liste des validateurs disponibles private availableValidators = ['naming', 'errorHandling', 'security', 'performance', 'documentation', 'calendarIntegration', 'all']; constructor() { this.tool = new WorkflowValidatorTool(); this.outputBaseDir = process.env.VALIDATOR_OUTPUT_DIR || path.join(process.cwd(), 'output', 'validations'); // Créer le répertoire de sortie s'il n'existe pas if (!fs.existsSync(this.outputBaseDir)) { fs.mkdirSync(this.outputBaseDir, { recursive: true }); } } /** * Enregistre les routes de l'API pour l'outil * @param app Application Express */ registerRoutes(app: express.Application): void { // Route pour valider un workflow app.post('/api/workflow-validator/validate', async (req: express.Request, res: express.Response) => { try { const { workflow, strictness = 'medium', validators = this.availableValidators } = req.body; // Valider les paramètres requis if (!workflow) { return res.status(400).json({ success: false, message: 'Le paramètre workflow est requis' }); } // Exécuter l'outil const result = await this.tool.execute({ workflow, strictness, validators }); // Sauvegarder le résultat const outputPath = this.saveValidationResult(workflow, result); // Retourner le résultat return res.json({ success: true, result, outputPath }); } catch (error: unknown) { console.error('Erreur lors de la validation du workflow:', error); const errorMessage = error instanceof Error ? error.message : String(error); return res.status(500).json({ success: false, message: 'Erreur lors de la validation du workflow', error: errorMessage }); } }); // Route pour récupérer la liste des validateurs disponibles app.get('/api/workflow-validator/validators', (req: express.Request, res: express.Response) => { try { // Récupérer la liste des validateurs const validators = this.availableValidators; // Récupérer les détails de chaque validateur const validatorsDetails = validators.map(validatorName => { let validator: any; let description = ''; try { // Essayer de récupérer la description du validateur validator = this.getValidatorInstance(validatorName); description = validator.getDescription(); } catch (e) { description = `Validateur ${validatorName}`; } return { name: validatorName, description }; }); // Retourner la liste des validateurs return res.json({ success: true, validators: validatorsDetails }); } catch (error: unknown) { console.error('Erreur lors de la récupération des validateurs:', error); const errorMessage = error instanceof Error ? error.message : String(error); return res.status(500).json({ success: false, message: 'Erreur lors de la récupération des validateurs', error: errorMessage }); } }); // Route pour récupérer les résultats de validation précédents app.get('/api/workflow-validator/results', (req: express.Request, res: express.Response) => { try { // Vérifier que le répertoire existe if (!fs.existsSync(this.outputBaseDir)) { return res.json({ success: true, results: [] }); } // Récupérer la liste des fichiers de résultats const files = fs.readdirSync(this.outputBaseDir) .filter(file => file.endsWith('.json')) .map(file => { const filePath = path.join(this.outputBaseDir, file); const stats = fs.statSync(filePath); return { name: file, path: filePath, size: stats.size, createdAt: stats.birthtime }; }) .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); // Retourner la liste des résultats return res.json({ success: true, results: files }); } catch (error: unknown) { console.error('Erreur lors de la récupération des résultats:', error); const errorMessage = error instanceof Error ? error.message : String(error); return res.status(500).json({ success: false, message: 'Erreur lors de la récupération des résultats', error: errorMessage }); } }); // Route pour récupérer un résultat de validation spécifique app.get('/api/workflow-validator/results/:filename', (req: express.Request, res: express.Response) => { try { const { filename } = req.params; const filePath = path.join(this.outputBaseDir, filename); // Vérifier que le fichier existe if (!fs.existsSync(filePath)) { return res.status(404).json({ success: false, message: 'Résultat non trouvé' }); } // Lire le fichier const fileContent = fs.readFileSync(filePath, 'utf8'); const result = JSON.parse(fileContent); // Retourner le résultat return res.json({ success: true, result }); } catch (error: unknown) { console.error('Erreur lors de la récupération du résultat:', error); const errorMessage = error instanceof Error ? error.message : String(error); return res.status(500).json({ success: false, message: 'Erreur lors de la récupération du résultat', error: errorMessage }); } }); // Route pour supprimer un résultat de validation app.delete('/api/workflow-validator/results/:filename', (req: express.Request, res: express.Response) => { try { const { filename } = req.params; const filePath = path.join(this.outputBaseDir, filename); // Vérifier que le fichier existe if (!fs.existsSync(filePath)) { return res.status(404).json({ success: false, message: 'Résultat non trouvé' }); } // Supprimer le fichier fs.unlinkSync(filePath); // Retourner le résultat return res.json({ success: true, message: 'Résultat supprimé avec succès' }); } catch (error: unknown) { console.error('Erreur lors de la suppression du résultat:', error); const errorMessage = error instanceof Error ? error.message : String(error); return res.status(500).json({ success: false, message: 'Erreur lors de la suppression du résultat', error: errorMessage }); } }); } /** * Sauvegarde le résultat de validation dans un fichier * @param workflow Workflow validé * @param result Résultat de la validation * @returns Chemin du fichier de résultat */ private saveValidationResult(workflow: any, result: any): string { // Générer un nom de fichier unique const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const workflowName = workflow.name ? workflow.name.replace(/[^a-zA-Z0-9]/g, '_') : 'workflow'; const filename = `${workflowName}_${timestamp}.json`; const outputPath = path.join(this.outputBaseDir, filename); // Écrire le résultat dans un fichier fs.writeFileSync(outputPath, JSON.stringify(result, null, 2)); return outputPath; } /** * Récupère une instance d'un validateur * @param validatorName Nom du validateur * @returns Instance du validateur */ private getValidatorInstance(validatorName: string): any { // Cette méthode est une implémentation fictive pour l'exemple // Dans une implémentation réelle, vous devriez instancier le validateur approprié return { getDescription: () => `Validateur ${validatorName}` }; } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lowprofix/n8n-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server