import { useState, useRef } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Textarea } from "@/components/ui/textarea"; import { useToast } from "@/hooks/use-toast"; import { Upload, Play, Copy, AlertTriangle, Database } from "lucide-react"; import { useMutation } from "@tanstack/react-query"; import { apiRequest } from "@/lib/queryClient"; export default function SQLExecutor() { const { toast } = useToast(); const [sqlContent, setSqlContent] = useState(""); const [logs, setLogs] = useState([]); const [isExecuting, setIsExecuting] = useState(false); const fileInputRef = useRef(null); const executeMutation = useMutation({ mutationFn: async (sql: string) => { setLogs([]); setIsExecuting(true); const response = await fetch('/api/admin/execute-sql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql }), credentials: 'include' }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || 'Erreur lors de l\'exécution SQL'); } return response.json(); }, onSuccess: (result) => { setLogs(prev => [...prev, '✅ Exécution SQL terminée avec succès']); if (result.logs) { setLogs(prev => [...prev, ...result.logs]); } if (result.results) { setLogs(prev => [...prev, `📊 Résultats: ${JSON.stringify(result.results, null, 2)}`]); } toast({ title: "Succès", description: "SQL exécuté avec succès", }); }, onError: (error: any) => { setLogs(prev => [...prev, `❌ Erreur: ${error.message}`]); toast({ title: "Erreur", description: error.message, variant: "destructive", }); }, onSettled: () => { setIsExecuting(false); } }); const handleFileUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; if (!file.name.endsWith('.sql')) { toast({ title: "Erreur", description: "Veuillez sélectionner un fichier .sql", variant: "destructive", }); return; } const reader = new FileReader(); reader.onload = (e) => { const content = e.target?.result as string; setSqlContent(content); setLogs([`📁 Fichier ${file.name} chargé (${content.length} caractères)`]); }; reader.readAsText(file); }; const handleExecuteSQL = () => { if (!sqlContent.trim()) { toast({ title: "Erreur", description: "Veuillez saisir du SQL à exécuter", variant: "destructive", }); return; } setLogs([`🔄 Début de l'exécution SQL...`]); executeMutation.mutate(sqlContent); }; const handleCopyWebhookSQL = () => { const webhookSQL = `-- Script pour créer la table webhook_bap_config CREATE TABLE IF NOT EXISTS webhook_bap_config ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL DEFAULT 'Configuration BAP', webhook_url TEXT NOT NULL, description TEXT, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Insérer la configuration par défaut INSERT INTO webhook_bap_config (name, webhook_url, description, is_active) SELECT 'Configuration BAP', 'https://workflow.ffnancy.fr/webhook/a3d03176-b72f-412d-8fb9-f920b9fbab4d', 'Configuration par défaut pour envoi des fichiers BAP vers n8n', true WHERE NOT EXISTS (SELECT 1 FROM webhook_bap_config); -- Commentaire sur la table COMMENT ON TABLE webhook_bap_config IS 'Configuration pour webhook BAP n8n'; -- Vérification finale SELECT 'Table webhook_bap_config créée!' AS message; SELECT COUNT(*) AS nb_configs FROM webhook_bap_config;`; setSqlContent(webhookSQL); navigator.clipboard.writeText(webhookSQL); toast({ title: "SQL copié", description: "Le script webhook BAP a été copié et collé", }); }; return (

Exécution SQL

Avertissement de Sécurité Cette fonctionnalité permet d'exécuter du SQL directement sur la base de données. Utilisez-la avec précaution et uniquement pour des opérations de maintenance.
Script SQL Collez votre SQL ou uploadez un fichier .sql