import type { ConfigType } from '@nestjs/config'; import type { ClientProvider } from '@nestjs/microservices'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; import { httpConfig } from './config/http.config.js'; import { natsConfig } from './config/nats.config.js'; import { ssiConfig } from './config/ssi.config.js'; import { validationSchema } from './config/validation.js'; import { ProofsModule } from './proofs/proofs.module.js'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, load: [httpConfig, natsConfig, ssiConfig], cache: true, expandVariables: true, validationSchema, validationOptions: { allowUnknown: true, abortEarly: true, }, }), ClientsModule.registerAsync({ isGlobal: true, clients: [ { name: NATS_CLIENT, inject: [natsConfig.KEY], useFactory: (config: ConfigType<typeof natsConfig>) => { const provider: Required<ClientProvider> = { transport: Transport.NATS, options: { servers: config.url as string, }, }; if ('user' in config && 'password' in config) { provider.options.user = config.user as string; provider.options.pass = config.password as string; } return provider; }, }, ], }), HealthModule.registerAsync({ inject: [natsConfig.KEY], useFactory: (config: ConfigType<typeof natsConfig>) => { const options: Parameters<typeof HealthModule.register>[0] = {}; if (config.monitoringUrl) { options.nats = { monitoringUrl: config.monitoringUrl as string, }; } return options; }, }), ProofsModule, RouterModule.register([ { module: HealthModule, path: '/health' }, { module: ProofsModule, path: '/proofs' }, ]), ], }) export class Application {}