From 954cd6e1714b9cd8a2294fa1e18b1b2fb4667dd9 Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 4 Aug 2026 15:30:51 +0200 Subject: [PATCH] feat(15-05): static widget-to-module registration table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WIDGET_MODULE_MAP + getModuleSlugForWidgetType (apps/api/src/dashboard/widget-module-map.ts) - table intentionally empty at end of phase: all 8 existing widget types are module-free platform widgets (D-22) - code constant chosen over a WidgetInstance schema column — no migration for a field empty on every row --- apps/api/src/dashboard/widget-module-map.ts | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/api/src/dashboard/widget-module-map.ts diff --git a/apps/api/src/dashboard/widget-module-map.ts b/apps/api/src/dashboard/widget-module-map.ts new file mode 100644 index 0000000..d9af197 --- /dev/null +++ b/apps/api/src/dashboard/widget-module-map.ts @@ -0,0 +1,34 @@ +/** + * Zuordnung Widget-Typ → Modul (D-22, PERM-07). + * + * Zweck: Widgets eines für den Benutzer gesperrten Moduls verschwinden + * serverseitig aus GET /dashboard/widgets — DashboardService.getWidgets + * filtert darüber. + * + * Schlüssel sind Werte von `WidgetInstance.widgetType`, Werte sind + * Modul-Slugs aus `Module.slug`. + * + * Bewusst eine TypeScript-Konstante statt einer Spalte auf + * `WidgetInstance`: eine Migration auf einer bereits befüllten Tabelle + * für ein Feld, das derzeit für jede Zeile leer wäre, wiegt schwerer als + * diese Konstante mit identischer Aussagekraft (15-RESEARCH.md Pitfall 5). + * + * Die Tabelle ist am Ende dieser Phase bewusst leer: alle acht heute + * registrierten Widget-Typen (clock/search/calendar/note/calculator/ + * favorites/link/stopwatch, siehe apps/web/src/components/dashboard/ + * widget-registry.tsx) sind Plattform-Widgets ohne Modulbezug. Das + * einzige bislang geplante modulgebundene Widget steht in + * .planning/REQUIREMENTS.md unter "Future Requirements (deferred)" und + * wird in dieser Phase bewusst nicht registriert. + */ +export const WIDGET_MODULE_MAP: Readonly> = {}; + +/** + * Liefert den Modul-Slug für einen Widget-Typ, oder `undefined`, wenn + * der Typ kein Modul-Widget ist (der heutige Zustand für alle acht + * bestehenden Typen). Einziger Lesezugriff auf die Zuordnungstabelle, + * damit Tests sie gezielt mocken können. + */ +export function getModuleSlugForWidgetType(widgetType: string): string | undefined { + return WIDGET_MODULE_MAP[widgetType]; +}