feat(15-02): automatische Standardgruppen-Mitgliedschaft an genau einem Ort
- UserService.create ruft nach der Anlage GroupsService.addUserToDefaultGroup auf (D-11/D-12) — einziger Erzeugungspunkt für Benutzer, erbt LdapService ohne eigene Kopie der Regel - try/catch mit Logger: gescheiterte Gruppenzuordnung bricht weder die Benutzeranlage noch einen LDAP-Sync-Lauf ab (T-15-14) - UserModule importiert GroupsModule, keine Zirkularität - 4 Tests in user.service.spec.ts; ldap.service.ts unverändert
This commit is contained in:
@@ -1,10 +1,16 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import * as argon2 from 'argon2';
|
||||
import { GroupsService } from '../groups/groups.service';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
|
||||
@Injectable()
|
||||
export class UserService {
|
||||
constructor(private prisma: PrismaService) {}
|
||||
private readonly logger = new Logger(UserService.name);
|
||||
|
||||
constructor(
|
||||
private prisma: PrismaService,
|
||||
private readonly groupsService: GroupsService,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Find user by username. Uses UNSCOPED Prisma (not tenant-scoped)
|
||||
@@ -28,6 +34,17 @@ export class UserService {
|
||||
/**
|
||||
* Create a new user with hashed password.
|
||||
* Username is normalized to lowercase so login is case-insensitive.
|
||||
*
|
||||
* D-11/D-12 (PERM-06): dies ist der EINZIGE Erzeugungspunkt für Benutzer
|
||||
* im gesamten Backend — sowohl der Admin-UserController als auch
|
||||
* LdapService.upsertMappedUser und LdapService.importUsersByDn erzeugen
|
||||
* Benutzer ausschließlich hierüber. Nach der Anlage wird deshalb genau
|
||||
* an dieser einen Stelle die Mitgliedschaft in der markierten
|
||||
* Standardgruppe des Mandanten hergestellt, statt die Regel in jedem
|
||||
* Aufrufer zu wiederholen. Der Aufruf liegt in try/catch mit Logger
|
||||
* (T-15-14): eine gescheiterte Gruppenzuordnung darf weder die
|
||||
* Benutzeranlage noch einen LDAP-Sync-Lauf über hunderte Benutzer
|
||||
* abbrechen.
|
||||
*/
|
||||
async create(data: {
|
||||
username: string;
|
||||
@@ -40,13 +57,25 @@ export class UserService {
|
||||
ldapDn?: string;
|
||||
}) {
|
||||
const { password, ...rest } = data;
|
||||
return this.prisma.user.create({
|
||||
const created = await this.prisma.user.create({
|
||||
data: {
|
||||
...rest,
|
||||
username: rest.username.toLowerCase(),
|
||||
passwordHash: password ? await argon2.hash(password) : null,
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
await this.groupsService.addUserToDefaultGroup(created.tenantId, created.id);
|
||||
} catch (err) {
|
||||
this.logger.error(
|
||||
`Standardgruppen-Zuordnung fehlgeschlagen für Benutzer '${created.id}': ${
|
||||
err instanceof Error ? err.message : String(err)
|
||||
}`,
|
||||
);
|
||||
}
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user