/** * Script pour tester l'endpoint /api/admin/statistics */ import { pool } from '../db.js'; async function testStatisticsAPI() { try { console.log('🔄 Test de l\'endpoint /admin/statistics...\n'); // D'abord, rĂ©cupĂ©rer un admin pour avoir le token const adminResult = await pool.query(` SELECT id, email, first_name, last_name FROM users WHERE role = 'ADMIN' LIMIT 1 `); if (adminResult.rows.length === 0) { console.log('⚠ Aucun admin trouvĂ© dans la base de donnĂ©es'); console.log(' CrĂ©ez un admin d\'abord avec:'); console.log(' npm run db:seed'); process.exit(1); } const admin = adminResult.rows[0]; console.log(`✅ Admin trouvĂ©: ${admin.email} (${admin.first_name} ${admin.last_name})`); console.log(' Note: Pour tester l\'API, vous devez vous connecter via l\'interface ou utiliser curl/Postman\n'); // Simuler ce que l'endpoint retournerait en appelant directement les mĂȘmes requĂȘtes console.log('📊 Simulation des statistiques (requĂȘtes SQL directes):\n'); // Statistiques utilisateurs const usersStats = await pool.query(` SELECT COUNT(*) as total_users, COUNT(CASE WHEN role = 'CLIENT' THEN 1 END) as clients, COUNT(CASE WHEN role = 'EMPLOYEE' THEN 1 END) as employees, COUNT(CASE WHEN role = 'ADMIN' THEN 1 END) as admins, COUNT(CASE WHEN is_verified = TRUE THEN 1 END) as verified_users FROM users `); console.log('đŸ‘„ Utilisateurs:'); console.log(` - Total: ${usersStats.rows[0].total_users}`); console.log(` - Clients: ${usersStats.rows[0].clients}`); console.log(` - EmployĂ©s: ${usersStats.rows[0].employees}`); console.log(` - Admins: ${usersStats.rows[0].admins}`); console.log(` - Emails vĂ©rifiĂ©s: ${usersStats.rows[0].verified_users}\n`); // Statistiques tickets const ticketsStats = await pool.query(` SELECT COUNT(*) as total_tickets, COUNT(CASE WHEN user_id IS NOT NULL THEN 1 END) as distributed, COUNT(CASE WHEN played_at IS NOT NULL THEN 1 END) as used, COUNT(CASE WHEN status = 'PENDING' THEN 1 END) as pending, COUNT(CASE WHEN status = 'CLAIMED' THEN 1 END) as claimed, COUNT(CASE WHEN status = 'REJECTED' THEN 1 END) as rejected, COUNT(CASE WHEN validated_at IS NOT NULL THEN 1 END) as validated FROM tickets `); console.log('đŸŽ« Tickets:'); console.log(` - Total: ${ticketsStats.rows[0].total_tickets}`); console.log(` - DistribuĂ©s: ${ticketsStats.rows[0].distributed}`); console.log(` - UtilisĂ©s: ${ticketsStats.rows[0].used}`); console.log(` - En attente: ${ticketsStats.rows[0].pending}`); console.log(` - ValidĂ©s: ${ticketsStats.rows[0].validated}`); console.log(` - RĂ©clamĂ©s: ${ticketsStats.rows[0].claimed}`); console.log(` - RejetĂ©s: ${ticketsStats.rows[0].rejected}\n`); // RĂ©partition des lots const prizeDistribution = await pool.query(` SELECT p.id as prize_id, p.name as prize_name, p.type as prize_type, COUNT(t.id) as count, CASE WHEN (SELECT COUNT(*) FROM tickets) > 0 THEN ROUND((COUNT(t.id)::DECIMAL / (SELECT COUNT(*) FROM tickets)) * 100, 2) ELSE 0 END as percentage FROM prizes p LEFT JOIN tickets t ON p.id = t.prize_id GROUP BY p.id, p.name, p.type ORDER BY count DESC `); console.log('🎁 RĂ©partition des lots:'); prizeDistribution.rows.forEach(prize => { console.log(` - ${prize.prize_name}: ${prize.count} (${prize.percentage}%)`); }); console.log(''); // Statistiques dĂ©mographiques - Genre const genderStats = await pool.query(` SELECT COUNT(CASE WHEN gender = 'MALE' THEN 1 END) as male, COUNT(CASE WHEN gender = 'FEMALE' THEN 1 END) as female, COUNT(CASE WHEN gender = 'OTHER' THEN 1 END) as other, COUNT(CASE WHEN gender = 'NOT_SPECIFIED' OR gender IS NULL THEN 1 END) as not_specified FROM users WHERE role = 'CLIENT' `); console.log('đŸ‘€ DĂ©mographie - Genre:'); console.log(` - Hommes: ${genderStats.rows[0].male}`); console.log(` - Femmes: ${genderStats.rows[0].female}`); console.log(` - Autre: ${genderStats.rows[0].other}`); console.log(` - Non spĂ©cifiĂ©: ${genderStats.rows[0].not_specified}\n`); // Statistiques dĂ©mographiques - Âge const ageStats = await pool.query(` SELECT age_range as range, COUNT(*) as count, ROUND((COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users WHERE role = 'CLIENT')) * 100, 2) as percentage FROM ( SELECT CASE WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 18 AND 25 THEN '18-25' WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 26 AND 35 THEN '26-35' WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 36 AND 45 THEN '36-45' WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 46 AND 55 THEN '46-55' WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 56 AND 65 THEN '56-65' WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) > 65 THEN '65+' ELSE 'Non spĂ©cifiĂ©' END as age_range FROM users WHERE role = 'CLIENT' ) subquery GROUP BY age_range ORDER BY CASE age_range WHEN '18-25' THEN 1 WHEN '26-35' THEN 2 WHEN '36-45' THEN 3 WHEN '46-55' THEN 4 WHEN '56-65' THEN 5 WHEN '65+' THEN 6 ELSE 7 END `); console.log('📅 DĂ©mographie - Âge:'); ageStats.rows.forEach(age => { console.log(` - ${age.range}: ${age.count} (${age.percentage}%)`); }); console.log(''); // Top villes const topCities = await pool.query(` SELECT city, COUNT(*) as count, ROUND((COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users WHERE role = 'CLIENT')) * 100, 2) as percentage FROM users WHERE role = 'CLIENT' AND city IS NOT NULL AND city != '' GROUP BY city ORDER BY count DESC LIMIT 10 `); console.log('📍 Top villes:'); topCities.rows.forEach((city, index) => { console.log(` ${index + 1}. ${city.city}: ${city.count} (${city.percentage}%)`); }); console.log(''); console.log('✅ Test terminĂ© !'); console.log('\n📝 Pour tester l\'API complĂšte:'); console.log(' 1. Connectez-vous Ă  l\'application avec un compte admin'); console.log(' 2. Ouvrez la console du navigateur (F12)'); console.log(' 3. Allez sur la page Dashboard admin'); console.log(' 4. VĂ©rifiez que les statistiques s\'affichent correctement'); console.log('\n Ou utilisez curl/Postman:'); console.log(' GET http://localhost:4000/api/admin/statistics'); console.log(' Header: Authorization: Bearer '); } catch (error) { console.error('❌ Erreur:', error.message); console.error(error); process.exit(1); } finally { await pool.end(); } } testStatisticsAPI();