Add SQL execution tool for administrators to manage database tables

Introduce a new admin-only utility tab allowing direct SQL query execution, file uploads (.sql), and logging of operations. Includes server-side endpoint and client-side UI for executing raw SQL commands against the database.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: cfbfe47c-0c9a-4ebf-8a41-2937407eccff
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/cfbfe47c-0c9a-4ebf-8a41-2937407eccff/ECRh2Iu
This commit is contained in:
michaelschal committed 2025-09-03 14:11:12 +00:00
1 parent 5b338b224e
commit 2c36650edd
6 files changed
+324 -101

No files matched your search

+67
View File
@@ -4157,6 +4157,73 @@ RÉSUMÉ DU SCAN
}
});
// API d'exécution SQL pour admin uniquement
app.post('/api/admin/execute-sql', isAuthenticated, async (req: any, res) => {
try {
// Vérifier que l'utilisateur est admin
const userId = req.user?.claims?.sub || req.user?.id;
if (!userId) {
return res.status(401).json({ error: 'Utilisateur non authentifié' });
}
const user = await storage.getUser(userId);
if (!user || user.role !== 'admin') {
return res.status(403).json({ error: 'Accès refusé - Admin uniquement' });
}
const { sql: sqlQuery } = req.body;
if (!sqlQuery || typeof sqlQuery !== 'string') {
return res.status(400).json({ error: 'SQL query requis' });
}
console.log('🔧 [SQL-EXECUTOR] Début exécution SQL pour admin:', userId);
console.log('🔧 [SQL-EXECUTOR] Query:', sqlQuery.substring(0, 200) + '...');
const logs = [`🔄 Exécution SQL démarrée...`];
try {
// Utilisation de drizzle-orm pour l'exécution
const { sql } = await import('drizzle-orm');
const result = await db.execute(sql.raw(sqlQuery));
logs.push(`✅ SQL exécuté avec succès`);
logs.push(`📊 Nombre de lignes affectées: ${result.rowCount || 0}`);
if (result.rows && result.rows.length > 0) {
logs.push(`📋 Nombre de lignes retournées: ${result.rows.length}`);
if (result.rows.length <= 10) {
logs.push(`📋 Résultats: ${JSON.stringify(result.rows, null, 2)}`);
} else {
logs.push(`📋 Échantillon (10 premières lignes): ${JSON.stringify(result.rows.slice(0, 10), null, 2)}`);
}
}
console.log('✅ [SQL-EXECUTOR] Exécution réussie');
res.json({
success: true,
logs,
results: result.rows,
rowCount: result.rowCount
});
} catch (sqlError: any) {
console.error('❌ [SQL-EXECUTOR] Erreur SQL:', sqlError);
logs.push(`❌ Erreur SQL: ${sqlError.message}`);
return res.status(500).json({
error: `Erreur SQL: ${sqlError.message}`,
logs
});
}
} catch (error: any) {
console.error('❌ [SQL-EXECUTOR] Erreur générale:', error);
res.status(500).json({ error: 'Erreur serveur', details: error.message });
}
});
// Create server instance
const httpServer = createServer(app);