docs(server): say why the admin domain does not import DatabaseBackupModule

DatabaseBackupModule stays @Global, but its comment gave a vague reason.
The real one is concrete: the backup domain already reaches admin through
auth and settings, so importing the module from AdminModule would add a
domain cycle that lint:boundaries rejects. The module comment now says
that and points at the e2e harness that imports it by hand, and
AdminModule notes where its DATABASE_BACKUP comes from.
This commit is contained in:
Maurice
2026-10-08 15:40:22 +02:00
parent 175f5d96da
commit b658b5e68d
2 changed files with 13 additions and 5 deletions
+4
View File
@@ -24,6 +24,10 @@ import { PackingModule } from '../packing/packing.module';
// not @Global, so the import must be explicit.
import { PermissionsModule } from '../permissions/permissions.module';
import { AppConfigModule } from '../app-config/app-config.module';
// AdminService and DemoResetJob inject DATABASE_BACKUP, which the @Global
// DatabaseBackupModule (nest/backup/) provides once BackupModule is in the
// graph. It is not imported here on purpose: see that module for the cycle an
// import would close.
import { Users } from '../../db/entities/Users.entity';
import { AuditLog } from '../../db/entities/AuditLog.entity';
import { AppSettings } from '../../db/entities/AppSettings.entity';
@@ -7,11 +7,15 @@ import { SqliteDatabaseBackup } from './sqlite-database-backup';
/**
* Binds the database backup port (`DATABASE_BACKUP`) to the engine in use.
*
* Global because its consumers sit in two domains that must not depend on each
* other: the backup domain itself and the admin domain (the demo reset job and
* the baseline route). They inject the token from the shared database kernel
* and never import this file. `BackupModule` imports it, which is what puts it
* in the application.
* Global because its consumers sit in two domains: the backup domain itself
* and the admin domain (the demo reset job and the baseline route). Admin
* cannot import this file. The backup domain already reaches admin (backup
* imports auth, auth imports settings, settings imports admin), so an
* `admin -> backup` import would close a new domain cycle that
* `lint:boundaries` refuses. Both inject the token from the shared database
* kernel instead. `BackupModule` imports this module, which is what puts it in
* the application; a test harness that mounts `AdminModule` without
* `BackupModule` imports it itself (tests/e2e/admin.e2e.test.ts).
*/
@Global()
@Module({