Improve user group assignment debugging and logging in production

Add SQL debugging script and enhanced console logs to diagnose user group assignment issues in production, addressing user reports of unassigned groups.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: a8a78c07-e900-425c-a577-5b4c5894379d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/a8a78c07-e900-425c-a577-5b4c5894379d/fwSlq3W
This commit is contained in:
michaelschal committed 2025-08-11 19:53:26 +00:00
1 parent f705fb4b1c
commit 07b848b127
4 files changed
+74 -1

No files matched your search

+15
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

+46
View File
@@ -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;
+13 -1
View File
@@ -187,12 +187,18 @@ export class DatabaseStorage implements IStorage {
}
async getUserWithGroups(id: string): Promise<UserWithGroups | undefined> {
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,