feat(15-05): static widget-to-module registration table

- 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
This commit is contained in:
2026-08-04 15:30:51 +02:00
parent c4d7b7ded6
commit 954cd6e171
@@ -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<Record<string, string>> = {};
/**
* 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];
}