Files
tessera-ctl/apps/api/src/app.module.ts
T
schalli 5ef7b0c6cc feat(nextcloud-status): Modul mit Statusabruf, Versionsbewertung und Kachelansicht
- NextcloudInstance mit Zeilenschutz, Migration 20261002150000
- Bewertung (Ampel) als reine Funktion, status.php-Abruf mit Grenzen, endoflife.date-Zwischenspeicher
- API: Liste mit Bewertung, Anlegen und Einzelprüfung nur mit Verwalten
- Modulseite mit Kacheln, Registrierung in Seitenleiste, Marktplatz und Symbolen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 14:49:02 +02:00

91 lines
3.3 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 { HandelswareDatevModule } from './handelsware-datev/handelsware-datev.module';
import { KantineDatevModule } from './kantine-datev/kantine-datev.module';
import { NextcloudStatusModule } from './nextcloud-status/nextcloud-status.module';
import { ProxmoxModule } from './proxmox/proxmox.module';
import { CustomModulesModule } from './custom-modules/custom-modules.module';
import { RemindersModule } from './reminders/reminders.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,
NextcloudStatusModule,
KantineDatevModule,
HandelswareDatevModule,
CustomModulesModule,
RemindersModule,
],
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 {}