Enable administrators to delete announcements in production environments

Implement PostgreSQL deletion logic for announcements and add detailed logging for the deletion process.

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/TG5LVcw
This commit is contained in:
michaelschal committed 2025-08-17 12:00:57 +00:00
1 parent cefa4b7c22
commit 2a94ea69f8
4 files changed
+49 -9

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

+1 -1
View File
@@ -2,4 +2,4 @@
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_localhost FALSE / FALSE 1755508872 connect.sid s%3A8siCpVkhgJFOCC-2efxz0Unao-G6QlnM.tzp77gMurWDDtFyYuwjNUy3wTm2X22lcdk%2F3rm4H2UE
#HttpOnly_localhost FALSE / FALSE 1755518399 connect.sid s%3AeiqDHjLNeMlsKw3-fPZNUmDPuQwie91D.WBWoFfmb%2BNeqMpcd%2BOflA%2Frt1Xjhz6Y8qgQy2can65A
+1 -1
View File
@@ -35,7 +35,7 @@ The platform is built with a clear separation of concerns, utilizing a modern fu
- **Invoice Verification Cache:** Robust caching system for invoice verification results with automatic expiration and conflict resolution. Enhanced with unique constraint handling and graceful error management for production stability (August 2025). Fixed production SSL certificate errors and fetch timeout loops with enhanced error handling, network timeout protection, and error result caching to prevent infinite retry loops (August 2025).
- **UI Scrollbar Optimization:** Eliminated redundant vertical scrollbar on the right side of the screen while preserving necessary internal page scrolling. Implemented global CSS rules with `overflow: hidden` on html/body/root and Layout height management to prevent vertical overflow issues in production (August 2025).
- **Task Management:** Système complet de gestion des tâches avec fonctionnalités temporelles avancées - tri intelligent (pending > priorité > date), dates d'échéance avec sélecteur calendrier, indicateurs visuels pour tâches en retard/urgentes, filtres par échéance (aujourd'hui, cette semaine, en retard, sans échéance), vue Kanban et liste, badges colorés pour statut temporel. Interface optimisée pour suivi prioritaire des tâches non validées. Correction critique de l'isolation des données : chaque magasin ne voit maintenant que ses propres tâches (Août 2025). **PRODUCTION FIX (Août 2025)** : Résolution du problème de rechargements multiples nécessaires pour l'administrateur - le cache des tâches s'invalide maintenant automatiquement lors du changement de magasin sélectionné.
- **Information System (Announcements):** Système d'informations complet remplaçant la carte commandes clients dans le dashboard - gestion d'annonces avec niveaux de priorité (normal, important, urgent), contrôle d'accès basé sur les rôles (admin : CRUD complet, autres rôles : lecture seule), tri intelligent par priorité et date, filtrage par magasin pour administrateurs, interface moderne avec badges colorés et indicateurs visuels. **PRODUCTION FIX MAJEUR (Août 2025)** : Correction critique du problème d'affichage en production PostgreSQL - fix du filtrage pour inclure annonces globales + magasin sélectionné, correction des relations d'auteur avec username au lieu d'ID, design adapté pour correspondre exactement aux autres cartes du dashboard.
- **Information System (Announcements):** Système d'informations complet remplaçant la carte commandes clients dans le dashboard - gestion d'annonces avec niveaux de priorité (normal, important, urgent), contrôle d'accès basé sur les rôles (admin : CRUD complet, autres rôles : lecture seule), tri intelligent par priorité et date, filtrage par magasin pour administrateurs, interface moderne avec badges colorés et indicateurs visuels. **PRODUCTION FIX MAJEUR (Août 2025)** : Correction critique du problème d'affichage en production PostgreSQL - fix du filtrage pour inclure annonces globales + magasin sélectionné, correction des relations d'auteur avec username au lieu d'ID, design adapté pour correspondre exactement aux autres cartes du dashboard. **SUPPRESSION FIX (Août 2025)** : Correction du problème de suppression en production - ajout de la logique PostgreSQL manquante dans la route DELETE, les annonces peuvent maintenant être supprimées correctement en production.
- **DLC Module Permissions:** Correction des permissions de validation DLC pour permettre aux admin, directeur et manager de valider les produits DLC. Ajout de logs de debug pour traçabilité des validations (Août 2025).
- **User and Permission Management:** Granular access controls ensuring that users (e.g., employees) have appropriate permissions for tasks like creating customer orders.
- **Reporting:** Statistical reporting, including monthly summaries of deliveries based on `deliveredDate`.
+47 -7
View File
@@ -3250,28 +3250,68 @@ RÉSUMÉ DU SCAN
});
app.delete('/api/announcements/:id', isAuthenticated, async (req: any, res) => {
console.log('🗑️ [SERVER] DELETE /api/announcements/:id endpoint hit');
console.log('🗑️ [SERVER] Announcement ID:', req.params.id);
try {
const userId = req.user.claims ? req.user.claims.sub : req.user.id;
console.log('🗑️ [SERVER] Extracted userId:', userId);
const user = await storage.getUserWithGroups(userId);
if (!user) {
console.error('🗑️ [SERVER] User not found for ID:', userId);
return res.status(404).json({ message: "User not found" });
}
console.log('🗑️ [SERVER] User found:', { username: user.username, role: user.role, id: user.id });
// Only admin can delete announcements
if (user.role !== 'admin') {
console.error('🗑️ [SERVER] Access denied - user role:', user.role);
return res.status(403).json({ message: "Only administrators can delete announcements" });
}
const id = parseInt(req.params.id);
const success = await storage.deleteAnnouncement(id);
if (!success) {
return res.status(404).json({ message: "Announcement not found" });
}
console.log('🗑️ [SERVER] Parsed announcement ID:', id);
res.json({ message: "Announcement deleted successfully" });
if (environment === 'production') {
// PRODUCTION: Supprimer dans PostgreSQL DASHBOARD_MESSAGES
console.log('🗑️ [PRODUCTION] Deleting from PostgreSQL DASHBOARD_MESSAGES table');
try {
const deletedRows = await db.delete(dashboardMessages).where(eq(dashboardMessages.id, id)).returning();
if (deletedRows.length === 0) {
console.error('🗑️ [PRODUCTION] Announcement not found:', id);
return res.status(404).json({ message: "Announcement not found" });
}
console.log('🗑️ [PRODUCTION] Announcement deleted successfully from DB:', deletedRows[0]);
res.json({ message: "Announcement deleted successfully" });
} catch (dbError) {
console.error('🗑️ [PRODUCTION] DB error, fallback to memory:', dbError);
const success = await storage.deleteAnnouncement(id);
if (!success) {
return res.status(404).json({ message: "Announcement not found" });
}
res.json({ message: "Announcement deleted successfully" });
}
} else {
// DÉVELOPPEMENT: Supprimer en mémoire
console.log('🗑️ [DEV] Deleting from memory storage');
const success = await storage.deleteAnnouncement(id);
if (!success) {
console.error('🗑️ [DEV] Announcement not found:', id);
return res.status(404).json({ message: "Announcement not found" });
}
console.log('🗑️ [DEV] Announcement deleted from memory');
res.json({ message: "Announcement deleted successfully" });
}
} catch (error) {
console.error("Error deleting announcement:", error);
console.error("🗑️ [SERVER] Error deleting announcement:", error);
res.status(500).json({ message: "Failed to delete announcement" });
}
});