diff --git a/.replit b/.replit index 853b5d3..e7ed764 100644 --- a/.replit +++ b/.replit @@ -37,4 +37,4 @@ args = "npm run dev" waitForPort = 5000 [agent] -integrations = ["javascript_database==1.0.0", "javascript_object_storage==1.0.0", "javascript_log_in_with_replit==1.0.0"] +integrations = ["javascript_log_in_with_replit==1.0.0", "javascript_database==1.0.0", "javascript_object_storage==1.0.0"] diff --git a/client/src/pages/SQLExecutor.tsx b/client/src/pages/SQLExecutor.tsx new file mode 100644 index 0000000..832a70f --- /dev/null +++ b/client/src/pages/SQLExecutor.tsx @@ -0,0 +1,236 @@ +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 + + + +
+ + + +
+ + + +