Files
tessera-ctl/apps/api/src/tenant/tenant.service.ts
T
schalli 0d7d8a597e feat(260805-fok): beide Mandanten-Entstehungspfade verdrahten + Startup-Reparatur
- TenantService.create ruft nach prisma.tenant.create ensureDefaultGroup
  auf; Fehler werden protokolliert, nicht propagiert (Muster aus
  UserService.create)
- tenant.module.ts importiert GroupsModule (keine Zirkularitaet, wie
  UserModule bereits vormacht)
- AdminSeedService.onApplicationBootstrap besteht jetzt aus zwei
  sequenziellen await-Schritten: seedAdmin() (bisheriger Rumpf, plus
  ensureDefaultGroup nach dem Tenant-Upsert und VOR user.create), dann
  ensureDefaultGroupsForAllTenants() als abschliessende Reparatur ueber
  ALLE Mandanten — laeuft unabhaengig von seedAdmin()s fruehen
  Rueckkehrpfaden (fehlende ENV / Admin existiert bereits) und ist je
  Mandant sowie insgesamt try/catch-gekapselt, blockiert den API-Start nie
- Reparatur sitzt bewusst NICHT als eigener onApplicationBootstrap-Hook
  in GroupsModule (Ordering-Falle aus tender-scheduler.service.ts)
- tenant.service.spec.ts, admin-seed.service.spec.ts (neu): Reihenfolge,
  beide fruehen Rueckkehrpfade, Fehlerisolation je Mandant, Idempotenz
  ueber zwei Bootstrap-Laeufe
2026-08-05 11:30:49 +02:00

52 lines
1.6 KiB
TypeScript

import { Injectable, Logger } from '@nestjs/common';
import { GroupsService } from '../groups/groups.service';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class TenantService {
private readonly logger = new Logger(TenantService.name);
constructor(
private prisma: PrismaService,
private readonly groupsService: GroupsService,
) {}
async findAll() {
return this.prisma.tenant.findMany();
}
async findById(id: string) {
return this.prisma.tenant.findUnique({ where: { id } });
}
/**
* Legt einen Mandanten an und stellt unmittelbar danach dessen
* Standardgruppe her (D-06/D-13), damit ein frisch angelegter Mandant
* ab dem ersten Benutzer nutzbar ist. Schlägt ensureDefaultGroup fehl,
* wird der Fehler protokolliert statt propagiert — die Mandanten-Anlage
* selbst war erfolgreich, und die Startup-Reparatur in
* AdminSeedService.ensureDefaultGroupsForAllTenants holt eine
* gescheiterte Gruppenanlage beim nächsten API-Start nach (Muster aus
* UserService.create).
*/
async create(data: { name: string; slug: string }) {
const tenant = await this.prisma.tenant.create({ data });
try {
await this.groupsService.ensureDefaultGroup(tenant.id);
} catch (err) {
this.logger.error(
`Standardgruppen-Anlage fehlgeschlagen für Mandant '${tenant.id}': ${
err instanceof Error ? err.message : String(err)
}`,
);
}
return tenant;
}
async update(id: string, data: { name?: string; slug?: string; isActive?: boolean }) {
return this.prisma.tenant.update({ where: { id }, data });
}
}