feat(07-04): DkvModule + registry seed + AppModule registration + i18n keys
- 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:
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user