feat(quick-260923-ad9): Reiter anlegen, umbenennen, loeschen, umsortieren - Task 2
dashboard.service.ts: createDashboard() (Namensvergabe "Dashboard N" fuellt Luecken, D-08; Obergrenze 20 Reiter, T-AD9-06), renameDashboard() (Riegel zuerst), deleteDashboard() (letzter Reiter bleibt, D-10; Loeschen + Neu- Nummerierung als EINE withTenantTransaction), reorderDashboards() (woertlich nach FavoritesService.reorder-Muster: Exakt-Abgleich vor jedem Schreiben, kein Teilschreiben, dieselbe Abweisung fuer unvollstaendige/unbekannte/ fremde Kennungen - T-AD9-04). dashboard.controller.ts: fuenf neue Wege unter tabs; PUT tabs/order VOR PATCH/DELETE tabs/:id deklariert (Routenreihenfolge). dashboard.controller.spec.ts (neu, 8 Tests): Durchreichung, Abweisung ohne Kontext, quelltextlesender Waechter fuer die Routenreihenfolge. dashboard.service.spec.ts: 61 Tests (43 alte + 18 neue fuer Anlegen, Umbenennen inkl. DTO-Beschneidung/-Laengenpruefung, Loeschen und Umsortieren - je ein Fall fuer "fremder Reiter" und "letzter Reiter bleibt"). Deviation (Rule 1): widget-module-map.spec.ts's CreateWidgetDto-Whitelist helper needed a dashboardId fixture after Task 1 made the field required - fixed inline, out of the plan's files_modified list but directly caused by Task 1's DTO change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
import { Transform } from 'class-transformer';
|
||||
import { IsString, Length } from 'class-validator';
|
||||
|
||||
/**
|
||||
* DTO for `PATCH /dashboard/tabs/:id` (quick-260923-ad9, Task 2).
|
||||
*
|
||||
* `name` wird VOR der Längenprüfung beschnitten (führende/nachgestellte
|
||||
* Leerräume zählen nicht mit) — ein reiner Leerraum-Name schlägt danach an
|
||||
* `@Length(1, 40)` fehl. Die Obergrenze von 40 Zeichen ist ein Riegel gegen
|
||||
* Massenanfragen, kein UI-Detail (T-AD9-06).
|
||||
*/
|
||||
export class RenameDashboardDto {
|
||||
@Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
|
||||
@IsString()
|
||||
@Length(1, 40)
|
||||
name!: string;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import {
|
||||
ArrayMaxSize,
|
||||
ArrayMinSize,
|
||||
ArrayUnique,
|
||||
IsArray,
|
||||
IsString,
|
||||
} from 'class-validator';
|
||||
|
||||
/**
|
||||
* DTO for `PUT /dashboard/tabs/order` (quick-260923-ad9, Task 2).
|
||||
*
|
||||
* `ids` ist die VOLLSTÄNDIGE Kennungsliste der Reiter des Benutzers, in
|
||||
* der gewünschten Reihenfolge — der Dienst verlangt einen exakten Abgleich
|
||||
* gegen die vorhandenen Reiter (kein Teil-Umsortieren, keine fremden/
|
||||
* unbekannten Kennungen), Muster `ReorderFavoritesDto`/`FavoritesService.
|
||||
* reorder` (260917-jdd). `ArrayMaxSize(20)` ist ein Riegel gegen
|
||||
* Massenanfragen (T-AD9-06) — ein Benutzer hat höchstens 20 Reiter.
|
||||
*/
|
||||
export class ReorderDashboardsDto {
|
||||
@IsArray()
|
||||
@ArrayMinSize(1)
|
||||
@ArrayMaxSize(20)
|
||||
@ArrayUnique()
|
||||
@IsString({ each: true })
|
||||
ids!: string[];
|
||||
}
|
||||
Reference in New Issue
Block a user