Update announcement system to use new dashboard messages table

Refactors the announcement storage and schema to utilize the new `dashboard_messages` table, renaming fields like `priority` to `type` and `groupId` to `storeId`, and updating sorting logic to reflect the new type system.

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/VpUPpsj
This commit is contained in:
michaelschal committed 2025-08-16 14:11:58 +00:00
1 parent 2659a48e4e
commit e7b33c5325
4 files changed
+73 -49

No files matched your search

+20 -23
View File
@@ -17,16 +17,15 @@ class AnnouncementMemoryStorage {
}
private initializeTestData() {
// Créer quelques annonces de test
// Créer quelques annonces de test avec la nouvelle structure DASHBOARD_MESSAGES
const testAnnouncement: Announcement = {
id: this.idCounter++,
title: "Bienvenue dans le système d'informations",
content: "Ce nouveau système remplace l'ancienne carte des commandes clients. Vous pouvez maintenant créer et gérer des annonces importantes.",
priority: 'important',
authorId: 'admin',
groupId: 1,
type: 'warning',
createdBy: 'admin',
storeId: 1,
createdAt: new Date(),
updatedAt: new Date(),
};
this.announcements.set(testAnnouncement.id, testAnnouncement);
@@ -34,11 +33,10 @@ class AnnouncementMemoryStorage {
id: this.idCounter++,
title: "Maintenance programmée",
content: "Une maintenance système aura lieu dimanche prochain de 2h à 4h du matin.",
priority: 'normal',
authorId: 'admin',
groupId: null, // Annonce globale
type: 'info',
createdBy: 'admin',
storeId: null, // Annonce globale
createdAt: new Date(Date.now() - 24 * 60 * 60 * 1000), // Hier
updatedAt: new Date(Date.now() - 24 * 60 * 60 * 1000),
};
this.announcements.set(testAnnouncement2.id, testAnnouncement2);
}
@@ -51,7 +49,7 @@ class AnnouncementMemoryStorage {
// Filtrer par groupIds si fourni (pour le filtrage admin par magasin)
if (groupIds && groupIds.length > 0) {
filteredAnnouncements = announcements.filter(announcement =>
!announcement.groupId || groupIds.includes(announcement.groupId)
!announcement.storeId || groupIds.includes(announcement.storeId)
);
}
@@ -66,8 +64,8 @@ class AnnouncementMemoryStorage {
// Ajouter les relations
const announcementsWithRelations = filteredAnnouncements.map(announcement => {
const author = usersMap.get(announcement.authorId);
const group = announcement.groupId ? groupsMap.get(announcement.groupId) : undefined;
const author = usersMap.get(announcement.createdBy);
const group = announcement.storeId ? groupsMap.get(announcement.storeId) : undefined;
return {
...announcement,
@@ -76,12 +74,12 @@ class AnnouncementMemoryStorage {
};
}).filter(a => a.author); // Filtrer celles sans auteur valide
// Trier par priorité (urgent > important > normal) puis par date (plus récent d'abord)
// Trier par type (error > warning > success > info) puis par date (plus récent d'abord)
return announcementsWithRelations.sort((a, b) => {
const priorityOrder = { urgent: 3, important: 2, normal: 1 };
const priorityDiff = (priorityOrder[b.priority as keyof typeof priorityOrder] || 1) -
(priorityOrder[a.priority as keyof typeof priorityOrder] || 1);
if (priorityDiff !== 0) return priorityDiff;
const typeOrder = { error: 4, warning: 3, success: 2, info: 1 };
const typeDiff = (typeOrder[b.type as keyof typeof typeOrder] || 1) -
(typeOrder[a.type as keyof typeof typeOrder] || 1);
if (typeDiff !== 0) return typeDiff;
return new Date(b.createdAt!).getTime() - new Date(a.createdAt!).getTime();
});
}
@@ -103,10 +101,9 @@ class AnnouncementMemoryStorage {
const announcement: Announcement = {
id,
...announcementData,
priority: announcementData.priority || 'normal',
groupId: announcementData.groupId || null,
type: announcementData.type || 'info',
storeId: announcementData.storeId || null,
createdAt: new Date(),
updatedAt: new Date(),
};
this.announcements.set(id, announcement);
@@ -130,8 +127,8 @@ class AnnouncementMemoryStorage {
const usersMap = new Map(users.map(u => [u.id, u]));
const groupsMap = new Map(groups.map(g => [g.id, g]));
const author = usersMap.get(announcement.authorId);
const group = announcement.groupId ? groupsMap.get(announcement.groupId) : undefined;
const author = usersMap.get(announcement.createdBy);
const group = announcement.storeId ? groupsMap.get(announcement.storeId) : undefined;
if (!author) {
return undefined;
@@ -154,7 +151,7 @@ class AnnouncementMemoryStorage {
...existingAnnouncement,
...announcementData,
id, // Ensure ID doesn't change
updatedAt: new Date(),
// Note: DASHBOARD_MESSAGES table n'a pas de champ updatedAt
};
this.announcements.set(id, updatedAnnouncement);
+2 -8
View File
@@ -49,14 +49,8 @@ if (isProduction && dbUrl && (dbUrl.includes('logiflow-db') || dbUrl.includes('l
neonConfig.webSocketConstructor = ws.default;
if (dbUrl) {
try {
pool = new Pool({ connectionString: dbUrl });
db = drizzle({ client: pool, schema });
} catch (error) {
console.error('❌ Neon connection failed, will use MemStorage:', error);
pool = null;
db = null;
}
pool = new Pool({ connectionString: dbUrl });
db = drizzle({ client: pool, schema });
} else {
// Create dummy instances for development
pool = null;
+17
View File
@@ -10,6 +10,7 @@ import {
customerOrders,
dlcProducts,
tasks,
dashboardMessages,
announcements,
nocodbConfig,
invoiceVerificationCache,
@@ -3346,6 +3347,22 @@ export class MemStorage implements IStorage {
return await announcementStorage.getAnnouncements(groupIds);
}
async getAnnouncement(id: number): Promise<AnnouncementWithRelations | undefined> {
const announcementStorage = getAnnouncementStorage(
async () => Array.from(this.users.values()),
async () => Array.from(this.groups.values())
);
return await announcementStorage.getAnnouncement(id);
}
async updateAnnouncement(id: number, announcementData: Partial<InsertAnnouncement>): Promise<AnnouncementWithRelations> {
const announcementStorage = getAnnouncementStorage(
async () => Array.from(this.users.values()),
async () => Array.from(this.groups.values())
);
return await announcementStorage.updateAnnouncement(id, announcementData);
}
async deleteAnnouncement(id: number): Promise<boolean> {
const announcementStorage = getAnnouncementStorage(
async () => Array.from(this.users.values()),