feat: move configuration from .env to DB with Admin UI management
Replace hardcoded .env configuration with database-backed settings
manageable through the Admin web interface. This reduces .env to
bootstrap-only variables (DB, Keycloak, encryption keys).
Backend:
- Add SystemSetting Prisma model with category, valueType, isSecret
- Add system-settings NestJS module (CRUD, 60s cache, encryption)
- Refactor all 7 connectors to lazy-load credentials from DB via
CredentialsService.findActiveByType() instead of ConfigService
- Add event-driven credential reload (@nestjs/event-emitter)
- Dynamic CORS origins and conditional Swagger from DB settings
- Fix JWT strategy: use Keycloak JWKS (RS256) instead of symmetric secret
- Add SYSTEM_SETTINGS_VIEW/MANAGE permissions
- Seed 13 default settings (sync intervals, features, branding, CORS)
- Add env-to-db migration script (prisma/migrate-env-to-db.ts)
Frontend:
- Add use-credentials hook (full CRUD for integration credentials)
- Add use-system-settings hook (read/update system settings)
- Wire admin-integrations page to real API (create/update/test/toggle)
- Add admin system-settings page with 4 tabs (Branding, CORS, Sync, Features)
- Fix sidebar double-highlighting with exactMatch flag
- Fix integration detail fallback when API unavailable
- Fix API client to unwrap backend's {success, data} envelope
- Update NEXT_PUBLIC_API_URL to include /v1 version prefix
- Fix activity-widget hydration error
- Add i18n keys for systemSettings (de + en)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
import { EventEmitterModule } from '@nestjs/event-emitter';
|
||||
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
|
||||
import { PrismaModule } from './prisma/prisma.module';
|
||||
import { AuthModule } from './auth/auth.module';
|
||||
@@ -18,6 +19,9 @@ import { DashboardModule } from './modules/dashboard/dashboard.module';
|
||||
import { DepartmentsModule } from './modules/departments/departments.module';
|
||||
import { UserPreferencesModule } from './modules/user-preferences/user-preferences.module';
|
||||
|
||||
// Phase 1 modules - System Settings
|
||||
import { SystemSettingsModule } from './modules/system-settings/system-settings.module';
|
||||
|
||||
// Phase 4 modules - LEAN
|
||||
import { LeanModule } from './modules/lean/lean.module';
|
||||
|
||||
@@ -40,6 +44,9 @@ import { IntegrationsModule } from './modules/integrations/integrations.module';
|
||||
},
|
||||
}),
|
||||
|
||||
// Event emitter for decoupled inter-module communication
|
||||
EventEmitterModule.forRoot(),
|
||||
|
||||
// Database
|
||||
PrismaModule,
|
||||
|
||||
@@ -51,6 +58,9 @@ import { IntegrationsModule } from './modules/integrations/integrations.module';
|
||||
UsersModule,
|
||||
HealthModule,
|
||||
|
||||
// Phase 1 - System Settings (database-backed configuration)
|
||||
SystemSettingsModule,
|
||||
|
||||
// Phase 2 modules
|
||||
AuditModule,
|
||||
DashboardModule,
|
||||
|
||||
Reference in New Issue
Block a user