mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 05:26:47 +00:00
ac96644508
Four files taken apart rather than moved, because they only worked as a knot. The mailer becomes its own leaf module. AuthService sends the password-reset mail while NotificationsModule imports AuthModule for the demo gate in NotificationsMcp - a mailer inside the notifications domain would have closed a hard cycle that only a forwardRef could open again. Webhook and ntfy stay with notifications; auth has no business importing them. The channel registry stays a module singleton and does NOT become a provider. PluginRuntimeService pushes its channel getter in at onModuleInit, and notifications.bridge.ts builds its own NotificationsService for the scheduler crons and the memories senders. A provider would hand the bridge a second, empty registry - every plugin channel would then go quiet with no error anywhere. CHOVR-015 drives that seam end to end: a channel published through the runtime, delivered through the bridge. Nothing pinned it before; the existing cases all set the source themselves. The built-ins no longer self-register by side-effect import. They used to exist only because notificationPreferencesService happened to `import './notifications/builtins'`; removing that line would have silenced email, webhook and ntfy without a failure. They are built from the injected transports and registered from NotificationsService's constructor, so both instances have them. No cached nodemailer transport: MailerService.createTransport re-reads the SMTP config and skipTlsVerify per send, exactly as the three inline call sites did, so an admin changing them does not have to restart. Preferences become a provider over DatabaseService. Eight places built NotificationsService by hand, so a tests/helpers/notifications.ts factory keeps the next constructor parameter a one-file diff instead of an eight-file one.
40 lines
2.2 KiB
TypeScript
40 lines
2.2 KiB
TypeScript
import { RateLimitModule } from '../common/rate-limit.module';
|
|
import { Module } from '@nestjs/common';
|
|
import { AuthPublicController } from './auth-public.controller';
|
|
import { AuthController } from './auth.controller';
|
|
import { PasskeyController } from './passkey.controller';
|
|
import { AuthService } from './auth.service';
|
|
import { PasskeyService } from './passkey.service';
|
|
import { UserCleanupService } from './user-cleanup.service';
|
|
import { WebauthnConfigService } from './webauthn-config.service';
|
|
import { AppConfigModule } from '../app-config/app-config.module';
|
|
import { AuditModule } from '../audit/audit.module';
|
|
import { MailerModule } from '../notifications/mailer/mailer.module';
|
|
import { PermissionsModule } from '../permissions/permissions.module';
|
|
import { AtlasModule } from '../atlas/atlas.module';
|
|
import { TripMembershipModule } from '../trip-membership/trip-membership.module';
|
|
|
|
/**
|
|
* Auth module — public flows (login/register/reset/mfa-verify/logout) and the
|
|
* authenticated account/MFA/token endpoints. The OIDC sub-mount (/api/auth/oidc)
|
|
* is a separate, not-yet-migrated route, so the strangler lists the auth
|
|
* sub-paths explicitly rather than claiming all of /api/auth.
|
|
*
|
|
* PermissionsModule feeds getAppConfig's permissions block; AtlasModule feeds
|
|
* getTravelStats' hidden-countries subtraction; MailerModule sends the
|
|
* password-reset mail. It is a leaf module of its own precisely so this import
|
|
* does not become AuthModule -> NotificationsModule -> AuthModule. AuthService is
|
|
* exported for the in-container consumers (the domain *.mcp.ts demo guards,
|
|
* OidcService, PasskeyEnabledGuard); PasskeyService for AdminService's passkey
|
|
* reset; UserCleanupService for the two account-deletion paths (AdminService)
|
|
* and the guest deletion in TripsService; everything outside the container goes
|
|
* through auth.bridge.ts.
|
|
*/
|
|
@Module({
|
|
imports: [RateLimitModule, AuditModule, PermissionsModule, AtlasModule, TripMembershipModule, MailerModule, AppConfigModule],
|
|
controllers: [AuthPublicController, AuthController, PasskeyController],
|
|
providers: [AuthService, PasskeyService, UserCleanupService, WebauthnConfigService],
|
|
exports: [AuthService, PasskeyService, UserCleanupService],
|
|
})
|
|
export class AuthModule {}
|