diff --git a/PRODUCTION-FIX-GUIDE.md b/PRODUCTION-FIX-GUIDE.md index 55c9745..28fbff0 100644 --- a/PRODUCTION-FIX-GUIDE.md +++ b/PRODUCTION-FIX-GUIDE.md @@ -32,6 +32,21 @@ ADD COLUMN IF NOT EXISTS created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 1. **Changement de Mot de Passe** : Testez via l'interface utilisateur 2. **Attribution de Groupes** : Testez l'assignment d'utilisateurs aux groupes +## Débogage Production + +### Script de Diagnostic SQL +Utilisez le script `debug-usergroups-production.sql` pour : +- Vérifier la structure de la table user_groups +- Examiner les données existantes +- Identifier les problèmes d'association utilisateur-groupe + +### Logs de Débogage +Les logs suivants sont maintenant disponibles : +- `🔍 getUserWithGroups called for user: [id]` +- `🔍 Querying user_groups for user: [id]` +- `🔍 Found X group assignments for user [id]` +- `⚠️ Production mode: user_groups table missing created_at column, using raw SQL` + ## Déploiement 1. Redéployez votre application avec les dernières modifications diff --git a/attached_assets/image_1754941873531.png b/attached_assets/image_1754941873531.png new file mode 100644 index 0000000..e2a601c Binary files /dev/null and b/attached_assets/image_1754941873531.png differ diff --git a/debug-usergroups-production.sql b/debug-usergroups-production.sql new file mode 100644 index 0000000..7944642 --- /dev/null +++ b/debug-usergroups-production.sql @@ -0,0 +1,46 @@ +-- Script de débogage pour vérifier l'état des groupes d'utilisateurs en production +-- À exécuter sur votre base de données de production + +-- 1. Vérifier la structure de la table user_groups +\d user_groups; + +-- 2. Vérifier tous les enregistrements dans user_groups +SELECT * FROM user_groups ORDER BY user_id; + +-- 3. Vérifier les groupes disponibles +SELECT id, name, color FROM groups ORDER BY name; + +-- 4. Vérifier les utilisateurs existants +SELECT id, username, email, role FROM users ORDER BY username; + +-- 5. Requête combinée pour voir les associations utilisateur-groupe +SELECT + u.id as user_id, + u.username, + u.email, + ug.group_id, + g.name as group_name, + g.color as group_color +FROM users u +LEFT JOIN user_groups ug ON u.id = ug.user_id +LEFT JOIN groups g ON ug.group_id = g.id +ORDER BY u.username, g.name; + +-- 6. Compter les associations par utilisateur +SELECT + u.username, + COUNT(ug.group_id) as groups_count +FROM users u +LEFT JOIN user_groups ug ON u.id = ug.user_id +GROUP BY u.id, u.username +ORDER BY u.username; + +-- 7. Vérifier s'il y a des enregistrements orphelins dans user_groups +SELECT + ug.*, + CASE WHEN u.id IS NULL THEN 'USER_MISSING' ELSE 'USER_OK' END as user_status, + CASE WHEN g.id IS NULL THEN 'GROUP_MISSING' ELSE 'GROUP_OK' END as group_status +FROM user_groups ug +LEFT JOIN users u ON ug.user_id = u.id +LEFT JOIN groups g ON ug.group_id = g.id +WHERE u.id IS NULL OR g.id IS NULL; \ No newline at end of file diff --git a/server/storage.ts b/server/storage.ts index 96f244a..e62a2ad 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -187,12 +187,18 @@ export class DatabaseStorage implements IStorage { } async getUserWithGroups(id: string): Promise { + console.log(`🔍 getUserWithGroups called for user: ${id}`); + // Get the user first const user = await this.getUser(id); - if (!user) return undefined; + if (!user) { + console.log(`❌ User ${id} not found`); + return undefined; + } // Fixed: Use manual SQL to avoid userGroups.createdAt column that doesn't exist try { + console.log(`🔍 Querying user_groups for user: ${id}`); const result = await db.execute(sql` SELECT ug.user_id, @@ -211,6 +217,9 @@ export class DatabaseStorage implements IStorage { WHERE ug.user_id = ${id} `); + console.log(`🔍 Found ${result.rows.length} group assignments for user ${id}`); + console.log(`🔍 Raw query result:`, result.rows); + const userGroupsData = result.rows.map((row: any) => ({ userId: row.user_id, groupId: row.group_id, @@ -228,12 +237,15 @@ export class DatabaseStorage implements IStorage { } })); + console.log(`✅ Processed ${userGroupsData.length} groups for user ${id}`); + return { ...user, userGroups: userGroupsData, }; } catch (error) { console.error('❌ getUserWithGroups error:', error); + console.error('❌ Error details:', error?.code, error?.message); // Fallback: return user with empty groups return { ...user,