Skip to content
Snippets Groups Projects
application.ts 2.2 KiB
Newer Older
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 {}