From 4ee0fdd206d7d626f1d9f3bb9ae8e871e3f6ad21 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Tue, 12 Aug 2025 08:03:34 +0000 Subject: [PATCH] Add diagnostic tools to view database schema and logs Integrate a new database debug page for administrators to view database schema, table counts, and relationships, accessible via a new route and sidebar item. Replit-Commit-Author: Agent Replit-Commit-Session-Id: b163d4c0-de5e-4f4e-a9c0-aed4c7049718 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/b163d4c0-de5e-4f4e-a9c0-aed4c7049718/xTmsprA --- client/src/components/RouterProduction.tsx | 2 + client/src/components/Sidebar.tsx | 6 + client/src/pages/DatabaseDebug.tsx | 158 +++++++++++++++++++++ server/routes.ts | 8 +- 4 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 client/src/pages/DatabaseDebug.tsx diff --git a/client/src/components/RouterProduction.tsx b/client/src/components/RouterProduction.tsx index 11a4395..f0b60d3 100644 --- a/client/src/components/RouterProduction.tsx +++ b/client/src/components/RouterProduction.tsx @@ -13,6 +13,7 @@ import BLReconciliation from "@/pages/BLReconciliation"; import Publicities from "@/pages/Publicities"; import NocoDBConfig from "@/pages/NocoDBConfig"; +import DatabaseDebug from "@/pages/DatabaseDebug"; import CustomerOrders from "@/pages/CustomerOrders"; import DlcPage from "@/pages/DlcPage"; @@ -77,6 +78,7 @@ function RouterProduction() { + diff --git a/client/src/components/Sidebar.tsx b/client/src/components/Sidebar.tsx index 065a88a..b2b7040 100644 --- a/client/src/components/Sidebar.tsx +++ b/client/src/components/Sidebar.tsx @@ -149,6 +149,12 @@ export default function Sidebar() { icon: Database, roles: ["admin"] }, + { + path: "/database-debug", + label: "Debug Base de Données", + icon: Database, + roles: ["admin"] + }, ]; const hasPermission = (roles: string[]) => { diff --git a/client/src/pages/DatabaseDebug.tsx b/client/src/pages/DatabaseDebug.tsx new file mode 100644 index 0000000..5e8f049 --- /dev/null +++ b/client/src/pages/DatabaseDebug.tsx @@ -0,0 +1,158 @@ +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Database, Eye, Loader2 } from "lucide-react"; +import { useAuthSimple } from "@/hooks/useAuthSimple"; + +export default function DatabaseDebug() { + const { user } = useAuthSimple(); + const [isLoading, setIsLoading] = useState(false); + const [result, setResult] = useState(null); + const [error, setError] = useState(null); + + const handleLogSchema = async () => { + setIsLoading(true); + setError(null); + setResult(null); + + try { + const response = await fetch('/api/debug/log-schema', { + method: 'GET', + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + }, + }); + + const data = await response.json(); + + if (response.ok) { + setResult(data); + } else { + setError(data.message || data.error || 'Erreur inconnue'); + } + } catch (err) { + setError('Erreur de connexion au serveur'); + } finally { + setIsLoading(false); + } + }; + + if (!user || user.role !== 'admin') { + return ( +
+ + +

+ Accès refusé. Seuls les administrateurs peuvent accéder à cette page. +

+
+
+
+ ); + } + + return ( +
+
+ +
+

Debug Base de Données

+

Outils de diagnostic pour la base de données de production

+
+
+ + + + + + Scanner le Schéma de la Base + + + +

+ Cette action va scanner votre base de données de production et logger toutes les tables, + colonnes et relations dans les logs du serveur. +

+ +
+

+ ⚠️ Note importante : Cette fonctionnalité ne marche qu'en production + sur votre serveur privé. Les résultats apparaîtront dans les logs de votre serveur. +

+
+ + + + {error && ( +
+

+ Erreur : {error} +

+
+ )} + + {result && ( +
+

✅ Scan terminé avec succès

+
+

Tables trouvées : {result.totalTables}

+

Relations FK : {result.totalForeignKeys}

+

Timestamp : {new Date(result.timestamp).toLocaleString('fr-FR')}

+

+ 📋 Consultez maintenant les logs de votre serveur pour voir le détail complet du schéma. +

+
+
+ )} +
+
+ + + + Instructions + + +
+

1. Cliquer sur "Démarrer le Scan du Schéma"

+

Cette action va déclencher le scan de votre base de données.

+
+ +
+

2. Consulter les logs du serveur

+

+ Les résultats apparaîtront dans les logs de votre application Node.js sur votre serveur privé. + Cherchez les lignes qui commencent par "🔍 ===== DÉBUT SCAN SCHÉMA BASE DE DONNÉES =====". +

+
+ +
+

3. Informations récupérées

+
    +
  • • Liste complète des tables
  • +
  • • Colonnes avec types de données et contraintes
  • +
  • • Nombre d'enregistrements par table
  • +
  • • Relations de clés étrangères
  • +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/server/routes.ts b/server/routes.ts index e11dbe1..707cd85 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1413,7 +1413,7 @@ export async function registerRoutes(app: Express): Promise { ORDER BY table_name `; - const tablesResult = await storage.db.query(tablesQuery); + const tablesResult = await (storage as any).db.query(tablesQuery); console.log(`\n📊 TOTAL DES TABLES TROUVÉES: ${tablesResult.rows.length}`); console.log('=========================================='); @@ -1439,7 +1439,7 @@ export async function registerRoutes(app: Express): Promise { ORDER BY ordinal_position `; - const columnsResult = await storage.db.query(columnsQuery, [tableName]); + const columnsResult = await (storage as any).db.query(columnsQuery, [tableName]); if (columnsResult.rows.length > 0) { columnsResult.rows.forEach((col, index) => { @@ -1453,7 +1453,7 @@ export async function registerRoutes(app: Express): Promise { // Compter les enregistrements dans la table try { const countQuery = `SELECT COUNT(*) as total FROM "${tableName}"`; - const countResult = await storage.db.query(countQuery); + const countResult = await (storage as any).db.query(countQuery); console.log(` 📈 Nombre d'enregistrements: ${countResult.rows[0].total}`); } catch (countError) { console.log(` ⚠️ Impossible de compter les enregistrements: ${countError.message}`); @@ -1484,7 +1484,7 @@ export async function registerRoutes(app: Express): Promise { ORDER BY tc.table_name, kcu.column_name `; - const fkResult = await storage.db.query(fkQuery); + const fkResult = await (storage as any).db.query(fkQuery); if (fkResult.rows.length > 0) { fkResult.rows.forEach(fk => {