b9d87be360
- Tabelle CustomModule mit Zeilenschutz (tenant_isolation_policy), Migration 20260929120000 - API /custom-modules: Lesen für jeden Angemeldeten, Schreiben nur Administrator, nur https ohne Zugangsdaten - Seitenleiste zeigt eigene Module unter ihrer Kategorie, Rahmen-Seite mit Sandbox und „In neuem Tab öffnen“ - MODULE_CATEGORIES als gemeinsame Liste, Zugriffsklassifikation nachgemessen fortgeschrieben Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
import { Module } from '@nestjs/common';
|
|
import { ConfigModule } from '@nestjs/config';
|
|
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
|
|
import { ScheduleModule } from '@nestjs/schedule';
|
|
import { AuthModule } from './auth/auth.module';
|
|
import { BugReportsModule } from './bug-reports/bug-reports.module';
|
|
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
|
|
import { RolesGuard } from './auth/guards/roles.guard';
|
|
import { ForcePasswordChangeInterceptor } from './auth/interceptors/force-password-change.interceptor';
|
|
import { DesktopModule } from './desktop/desktop.module';
|
|
import { HealthModule } from './health/health.module';
|
|
import { LdapModule } from './ldap/ldap.module';
|
|
import { MailModule } from './mail/mail.module';
|
|
import { CalendarModule } from './calendar/calendar.module';
|
|
import { DashboardModule } from './dashboard/dashboard.module';
|
|
import { DkvModule } from './dkv/dkv.module';
|
|
import { CertManagerModule } from './cert-manager/cert-manager.module';
|
|
import { FavoritesModule } from './favorites/favorites.module';
|
|
import { DomaincheckModule } from './domaincheck/domaincheck.module';
|
|
import { GroupsModule } from './groups/groups.module';
|
|
import { ModuleRegistryModule } from './module-registry/module-registry.module';
|
|
import { PrismaModule } from './prisma/prisma.module';
|
|
import { CryptoModule } from './crypto/crypto.module';
|
|
import { SettingsModule } from './settings/settings.module';
|
|
import { TenantGuard } from './tenant/tenant.guard';
|
|
import { TenantModule } from './tenant/tenant.module';
|
|
import { TendersModule } from './tenders/tenders.module';
|
|
import { UserModule } from './user/user.module';
|
|
import { ProxmoxModule } from './proxmox/proxmox.module';
|
|
import { CustomModulesModule } from './custom-modules/custom-modules.module';
|
|
|
|
@Module({
|
|
imports: [
|
|
ConfigModule.forRoot({ isGlobal: true }),
|
|
ScheduleModule.forRoot(),
|
|
PrismaModule,
|
|
CryptoModule,
|
|
AuthModule,
|
|
UserModule,
|
|
TenantModule,
|
|
HealthModule,
|
|
DesktopModule,
|
|
MailModule,
|
|
LdapModule,
|
|
ModuleRegistryModule,
|
|
GroupsModule,
|
|
DomaincheckModule,
|
|
CertManagerModule,
|
|
DashboardModule,
|
|
CalendarModule,
|
|
SettingsModule,
|
|
DkvModule,
|
|
FavoritesModule,
|
|
TendersModule,
|
|
BugReportsModule,
|
|
ProxmoxModule,
|
|
CustomModulesModule,
|
|
],
|
|
providers: [
|
|
// Global JWT guard: all routes require auth unless @Public()
|
|
{
|
|
provide: APP_GUARD,
|
|
useClass: JwtAuthGuard,
|
|
},
|
|
// Runs after JwtAuthGuard — sets req.tenantId from req.user (260911-e2s: no longer creates a Prisma client)
|
|
{
|
|
provide: APP_GUARD,
|
|
useClass: TenantGuard,
|
|
},
|
|
// Global roles guard: checks @Roles() decorator
|
|
{
|
|
provide: APP_GUARD,
|
|
useClass: RolesGuard,
|
|
},
|
|
// Global interceptor: forces password change if mustChangePassword=true (D-06 / Pitfall 5)
|
|
{
|
|
provide: APP_INTERCEPTOR,
|
|
useClass: ForcePasswordChangeInterceptor,
|
|
},
|
|
],
|
|
})
|
|
export class AppModule {}
|