Fix announcement display issues and improve user data association

Address critical production bug in the announcement system by ensuring correct filtering for global and store-specific announcements, and fix author association by using username instead of ID for PostgreSQL compatibility.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/dnQ3tT8
This commit is contained in:
michaelschal committed 2025-08-17 09:22:36 +00:00
1 parent 243240701c
commit cefa4b7c22
5 files changed
+230 -9

No files matched your search

+19 -7
View File
@@ -45,7 +45,7 @@ import {
} from "@shared/schema";
import { hasPermission } from "@shared/permissions";
import { z } from "zod";
import { eq, desc } from "drizzle-orm";
import { eq, desc, or, isNull } from "drizzle-orm";
import { invoiceVerificationService } from "./invoiceVerification";
import { backupService } from "./backupService";
import { weatherService } from "./weatherService.js";
@@ -3032,26 +3032,38 @@ RÉSUMÉ DU SCAN
createdAt: dashboardMessages.createdAt,
}).from(dashboardMessages);
// Filtrage par magasin pour admin
// Filtrage par magasin pour admin : inclure les annonces globales + annonces du magasin
if (user.role === 'admin' && req.query.storeId) {
query = query.where(eq(dashboardMessages.storeId, parseInt(req.query.storeId as string)));
const storeId = parseInt(req.query.storeId as string);
// Inclure les annonces globales (storeId = null) ET les annonces du magasin sélectionné
query = query.where(
or(
eq(dashboardMessages.storeId, storeId),
isNull(dashboardMessages.storeId)
)
);
}
const messages = await query.orderBy(desc(dashboardMessages.createdAt)).limit(5);
console.log('🔍 [PRODUCTION] Raw messages from DB:', messages.length, 'items:', messages);
// Ajouter les relations manuellement
const announcements = await Promise.all(
messages.map(async (message) => {
// Récupérer l'auteur
let author = { id: message.createdBy, firstName: 'Utilisateur', lastName: 'Inconnu' };
let author = { id: message.createdBy, firstName: 'Utilisateur', lastName: 'Inconnu', username: message.createdBy };
try {
// En production, createdBy est varchar, donc chercher par username
console.log('🔍 [PRODUCTION] Looking for user with username:', message.createdBy);
const [userResult] = await db.select().from(users).where(eq(users.username, message.createdBy));
console.log('🔍 [PRODUCTION] User search result:', userResult ? 'Found' : 'Not found');
if (userResult) {
author = {
id: userResult.id,
firstName: userResult.firstName || 'Utilisateur',
lastName: userResult.lastName || 'Inconnu'
lastName: userResult.lastName || 'Inconnu',
username: userResult.username
};
}
} catch (e) {
@@ -3138,8 +3150,8 @@ RÉSUMÉ DU SCAN
title: req.body.title,
content: req.body.content,
type: req.body.type || 'info',
storeId: null, // Toutes les annonces sont globales
createdBy: user.id,
storeId: req.body.storeId || null, // Permettre les annonces par magasin OU globales
createdBy: user.username, // Utiliser username pour PostgreSQL
});
console.log('🎯 [SERVER] Announcement data validated:', announcementData);