Files
tessera-ctl/apps/api/prisma/migrations/20260916120000_remove_link_widget/migration.sql
T
schalli 39ea1474a5 feat: Link-Widget restlos entfernt (Web, API, Migration, Handbuch, Changelog)
- Web: Union-Mitglied, Constraints, Icon, Registry-Eintrag, wire-Funktion,
  Katalog, Seiten-Verdrahtung, Tests und i18n (de/en) fuer den Typ link
  entfernt; link-widget.tsx/.test.tsx geloescht
- API: create-widget.dto.ts (@IsIn-Liste) und widget-module-map.ts
  (Kommentare) auf sieben Typen angepasst; schema.prisma unveraendert
- Neue Migration 20260916120000_remove_link_widget: eine idempotente
  DELETE-Anweisung auf WidgetInstance, FavoriteLink kaskadiert ueber den
  bestehenden FK; wird in diesem Auftrag NICHT ausgefuehrt
- Neuer widget-wrapper-Test belegt den grauen Fallback fuer unbekannte
  Widget-Typen (Bestandsverhalten, jetzt festgeschrieben)
- Handbuch (Widget-Tabelle, Einstellungs-Hinweise) und CHANGELOG
  (Geaendert/Entfernt/Behoben) aktualisiert
- Web: 52 Dateien / 344 Tests gruen, tsc Exit 0; API: tsc Exit 0,
  dashboard-Spec 31 Tests gruen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 13:44:09 +02:00

23 lines
1.2 KiB
SQL

-- Widget "Link" entfernt (quick-260916-iex): das Favoriten-Widget deckt den
-- Anwendungsfall "Schnellzugriff auf Links" bereits vollstaendig ab, ein
-- separates Einzel-Link-Widget ist ueberfluessig. Web/API haben den Typ
-- `link` restlos entfernt (Registry, Katalog, DTO); diese Migration raeumt
-- bestehende Link-Kacheln in der Datenbank hinterher.
--
-- FavoriteLink-Zeilen des jeweiligen Widgets kaskadieren automatisch ueber
-- den bestehenden Fremdschluessel "FavoriteLink_widgetId_fkey ... ON DELETE
-- CASCADE" (Migration 20260708090000_add_favorite_link) -- kein separates
-- DELETE auf "FavoriteLink" noetig.
--
-- Laeuft als Migrationsrolle "tessera" (POSTGRES_USER, Superuser mit
-- BYPASSRLS, siehe 20260909130000_rls_app_role). Die FORCE ROW LEVEL
-- SECURITY-Regel auf "WidgetInstance" (Migration 20260909140000) greift
-- fuer diese Rolle deshalb nicht -- das DELETE sieht und loescht ueber
-- alle Mandanten hinweg.
--
-- Idempotent: ein zweiter Lauf loescht 0 Zeilen. Keine Schemaaenderung.
-- Verwaiste Eintraege im Layout-JSON von "DashboardLayout" sind unschaedlich
-- (dashboard-grid.tsx rendert nur ueber widgets.map) und verschwinden beim
-- naechsten Speichern des Dashboards von selbst.
DELETE FROM "WidgetInstance" WHERE "widgetType" = 'link';