mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
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:
1 parent
5b338b224e
commit
2c36650edd
6 files changed
+324
-101
No files matched your search
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user