import { Module } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { MongooseModule } from '@nestjs/mongoose'; import { IdentityProvider, SessionCache, UserRegistry, } from '@task-stream/api/identity/application'; import { UserFactory } from '@task-stream/api/identity/domain'; import { MongoUserRegistry } from './mongo/mongo-user.registry'; import { UserDocument, UserSchema } from './mongo/user.schema'; import { PIREON_CONFIG, PireonConfig } from './pireon/pireon.config'; import { PireonIdentityProvider } from './pireon/pireon-identity.provider'; import { RedisSessionCache } from './redis/redis-session.cache'; /** Driven adapters of the identity context: Pireon (HTTP), Redis and MongoDB. */ @Module({ imports: [ MongooseModule.forFeature([ { name: UserDocument.name, schema: UserSchema }, ]), ], providers: [ UserFactory, { provide: PIREON_CONFIG, inject: [ConfigService], useFactory: (config: ConfigService): PireonConfig => ({ baseUrl: config.getOrThrow('PIREON_BASE_URL'), sessionTtlSeconds: Number(config.get('AUTH_SESSION_TTL_SECONDS', 60)), requestTimeoutMs: Number(config.get('PIREON_TIMEOUT_MS', 5000)), clientId: config.get('PIREON_CLIENT_ID') || undefined, clientSecret: config.get('PIREON_CLIENT_SECRET') || undefined, passwordClientId: config.get('PIREON_PASSWORD_CLIENT_ID') || undefined, passwordClientSecret: config.get('PIREON_PASSWORD_CLIENT_SECRET') || undefined, scopes: String(config.get('PIREON_SCOPES', 'users:read')) .split(/\s+/) .filter(Boolean), passwordGrant: String(config.get('PIREON_PASSWORD_GRANT', 'true')) !== 'false', }), }, { provide: IdentityProvider, useClass: PireonIdentityProvider }, { provide: SessionCache, useClass: RedisSessionCache }, { provide: UserRegistry, useClass: MongoUserRegistry }, ], exports: [IdentityProvider, SessionCache, UserRegistry], }) export class IdentityInfrastructureModule {}