feat(15-02): GroupsModule — CRUD für Gruppen, Mitgliedschaften und Löschauswirkung

- GroupsService: listForTenant/create/update/remove/getImpact/listMembers/addMembers/removeMember/addUserToDefaultGroup, jede Query tenantId-gescoped (T-15-02/T-15-12)
- isDefault:true läuft in einer Transaktion (updateMany+update), D-13
- getImpact liefert { memberCount, grantCount } für den Löschdialog (D-17)
- removeMember beschränkt sich auf source:MANUAL (D-19)
- GroupsController: 8 rollengeschützte Routen unter /groups
- 19 Tests in groups.service.spec.ts, hand-rolled In-Memory-Fake
This commit is contained in:
2026-08-04 15:21:41 +02:00
parent 79c83eae5f
commit 69494d7549
8 changed files with 914 additions and 0 deletions
@@ -0,0 +1,15 @@
import { IsNotEmpty, IsString } from 'class-validator';
/**
* DTO für das Anlegen einer Gruppe (PERM-01).
*
* Leerraum wird im Service getrimmt; ein leerer oder nur aus Leerzeichen
* bestehender Name wird dort explizit als BadRequestException abgelehnt
* (Trim passiert NACH der class-validator-Prüfung, deshalb reicht hier
* @IsNotEmpty auf den Rohwert nicht aus, um " " abzufangen).
*/
export class CreateGroupDto {
@IsString()
@IsNotEmpty()
name!: string;
}