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}`
};
}
}