feat(07-04): DkvModule + registry seed + AppModule registration + i18n keys
Tessera CI/CD / Build & Deploy (push) Blocked by required conditions
Tessera CI/CD / Lint & Type Check (push) Successful in 40s
Tessera CI/CD / Tests (push) Waiting to run

- dkv.seed.ts: seedDkvModule with slug=dkv-fleet, category=fleet, isSystem=true
- dkv.module.ts: imports ModuleRegistryModule + CalendarModule (CalendarCryptoService)
  provides all 7 DKV services + 2 providers + controller; OnModuleInit seeds registry
- app.module.ts: DkvModule added to imports (ScheduleModule + SettingsModule from Plans 01/03)
- de.json + en.json: complete dkvFleet namespace (50+ keys incl. status, col, form, errors)
- settings namespace extended with categoryGeneral, categorySmtp, smtp sub-object
This commit is contained in:
2026-06-27 00:30:08 +02:00
parent c22d36758c
commit 2a3d1c1e85
5 changed files with 290 additions and 2 deletions
+2
View File
@@ -11,6 +11,7 @@ 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 { DomaincheckModule } from './domaincheck/domaincheck.module';
import { ModuleRegistryModule } from './module-registry/module-registry.module';
import { PrismaModule } from './prisma/prisma.module';
@@ -35,6 +36,7 @@ import { UserModule } from './user/user.module';
DashboardModule,
CalendarModule,
SettingsModule,
DkvModule,
],
providers: [
// Global JWT guard: all routes require auth unless @Public()
+70
View File
@@ -0,0 +1,70 @@
import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { ModuleRegistryModule } from '../module-registry/module-registry.module';
import { ModuleRegistryService } from '../module-registry/module-registry.service';
import { CalendarModule } from '../calendar/calendar.module';
import { DkvController } from './dkv.controller';
import { DkvExportService } from './dkv-export.service';
import { DkvMailService } from './dkv-mail.service';
import { DkvParserService } from './dkv-parser.service';
import { DkvSchedulerService } from './dkv-scheduler.service';
import { DkvService } from './dkv.service';
import { ExchangeInboxProvider } from './providers/exchange-inbox.provider';
import { ImapProvider } from './providers/imap.provider';
import { seedDkvModule } from './dkv.seed';
/**
* NestJS module for the DKV Fleet feature.
*
* Provides the full DKV processing pipeline:
* - DkvService: orchestration (poll → parse → export → send → history)
* - DkvSchedulerService: dynamic cron job via SchedulerRegistry
* - DkvParserService: pdf-parse v2 text extraction + DKV-specific regex
* - DkvExportService: xlsx buffer generation + user-files/ management
* - DkvMailService: nodemailer.createTransport() at send time
* - ImapProvider / ExchangeInboxProvider: inbox access providers
*
* Imports:
* - ModuleRegistryModule: for registry self-seed on init
* - CalendarModule: provides CalendarCryptoService (AES-256-GCM encryption)
* re-exported from CalendarModule.exports — no re-declaration needed here.
*
* PrismaModule is global (no explicit import needed).
* ScheduleModule.forRoot() was registered in AppModule by Plan 01.
* SettingsModule (for DkvMailService → SettingsService) is imported in AppModule.
*
* Seeds itself into the module registry on application startup via
* OnModuleInit lifecycle hook — same pattern as DomaincheckModule.
*/
@Module({
imports: [
ModuleRegistryModule,
CalendarModule, // Provides CalendarCryptoService for inbox credential encryption
],
controllers: [DkvController],
providers: [
DkvService,
DkvSchedulerService,
DkvParserService,
DkvExportService,
DkvMailService,
ImapProvider,
ExchangeInboxProvider,
],
exports: [DkvService],
})
export class DkvModule implements OnModuleInit {
private readonly logger = new Logger(DkvModule.name);
constructor(
private readonly moduleRegistryService: ModuleRegistryService,
) {}
async onModuleInit(): Promise<void> {
try {
await seedDkvModule(this.moduleRegistryService);
this.logger.log('DKV Fleet module seeded in registry');
} catch (error) {
this.logger.error('Failed to seed DKV Fleet module', error);
}
}
}
+26
View File
@@ -0,0 +1,26 @@
import { ModuleRegistryService } from '../module-registry/module-registry.service';
/**
* Seeds the DKV Fleet module into the module registry.
*
* Called during DkvModule initialization (OnModuleInit) to ensure
* the 'dkv-fleet' module record exists in the database.
*
* Category 'fleet' identifies this as a fleet-management module.
* isSystem: true — not tenant-licensable in v1; available to all tenants.
*/
export async function seedDkvModule(
moduleRegistryService: ModuleRegistryService,
): Promise<void> {
await moduleRegistryService.seedModule({
slug: 'dkv-fleet',
name: 'DKV Flotte',
version: '1.0.0',
category: 'fleet',
description: {
de: 'DKV-Tankkartenrechnungen automatisch verarbeiten',
en: 'Automatically process DKV fuel card invoices',
},
isSystem: true,
});
}