refactor(admin): replace static dashboard stats with dynamic widget registry
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* Dashboard Server Registry — API générique
|
||||
*
|
||||
* Les features s'enregistrent ici via registerServerWidget().
|
||||
* Ce fichier ne doit jamais importer une feature directement.
|
||||
* Les features dépendent de ce fichier, pas l'inverse.
|
||||
*/
|
||||
|
||||
const widgets = new Map(); // id → fetcher
|
||||
|
||||
/**
|
||||
* Enregistre une fonction de fetch pour le tableau de bord.
|
||||
* Appelé en side effect par chaque feature (ex: auth/dashboard.server.js).
|
||||
* @param {string} id - Identifiant unique de la feature
|
||||
* @param {() => Promise<any>} fetcher - Fonction async retournant des données sérialisables
|
||||
*/
|
||||
export function registerServerWidget(id, fetcher) {
|
||||
widgets.set(id, fetcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exécute tous les fetchers enregistrés en parallèle.
|
||||
* Un fetcher qui échoue n'empêche pas les autres (Promise.allSettled).
|
||||
* @returns {Promise<Record<string, any>>} Map featureId → données
|
||||
*/
|
||||
export async function collectAllDashboardData() {
|
||||
const results = await Promise.allSettled(
|
||||
Array.from(widgets.entries()).map(([id, fetcher]) =>
|
||||
fetcher().then(data => ({ id, data }))
|
||||
)
|
||||
);
|
||||
|
||||
return results.reduce((acc, result) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
acc[result.value.id] = result.value.data;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
Reference in New Issue
Block a user