From d72501ad77d21008252837cac79816cc21345e43 Mon Sep 17 00:00:00 2001
From: Konstantin Tsabolov <konstantin.tsabolov@spherity.com>
Date: Mon, 22 Jan 2024 13:22:04 +0100
Subject: [PATCH] chore: add support for nats auth, fix config

---
 apps/credential-manager/src/application.ts    | 22 +++++++++----
 .../src/config/http.config.ts                 |  4 +--
 .../src/config/nats.config.ts                 |  6 ++--
 .../src/config/ssi.config.ts                  |  2 +-
 .../src/config/validation.ts                  | 12 ++++---
 apps/credential-manager/src/main.ts           | 33 ++++++++++++++-----
 6 files changed, 55 insertions(+), 24 deletions(-)

diff --git a/apps/credential-manager/src/application.ts b/apps/credential-manager/src/application.ts
index f60686b..982d2a6 100644
--- a/apps/credential-manager/src/application.ts
+++ b/apps/credential-manager/src/application.ts
@@ -1,4 +1,5 @@
 import type { ConfigType } from '@nestjs/config';
+import type { ClientProvider } from '@nestjs/microservices';
 
 import { Module } from '@nestjs/common';
 import { ConfigModule } from '@nestjs/config';
@@ -34,12 +35,21 @@ import { CredentialRequestsModule } from './credential-requests/credential-reque
         {
           name: NATS_CLIENT,
           inject: [natsConfig.KEY],
-          useFactory: (config: ConfigType<typeof natsConfig>) => ({
-            transport: Transport.NATS,
-            options: {
-              url: config.url as string,
-            },
-          }),
+          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;
+          },
         },
       ],
     }),
diff --git a/apps/credential-manager/src/config/http.config.ts b/apps/credential-manager/src/config/http.config.ts
index 0bb4d4c..fc63fd9 100644
--- a/apps/credential-manager/src/config/http.config.ts
+++ b/apps/credential-manager/src/config/http.config.ts
@@ -1,6 +1,6 @@
 import { registerAs } from '@nestjs/config';
 
 export const httpConfig = registerAs('http', () => ({
-  host: process.env.HOST,
-  port: Number(process.env.PORT),
+  host: process.env.HOST || '0.0.0.0',
+  port: Number(process.env.PORT) || 3000,
 }));
diff --git a/apps/credential-manager/src/config/nats.config.ts b/apps/credential-manager/src/config/nats.config.ts
index 023e923..194053c 100644
--- a/apps/credential-manager/src/config/nats.config.ts
+++ b/apps/credential-manager/src/config/nats.config.ts
@@ -1,6 +1,8 @@
 import { registerAs } from '@nestjs/config';
 
 export const natsConfig = registerAs('nats', () => ({
-  url: process.env.NATS_URL,
-  monitoringUrl: process.env.NATS_MONITORING_URL,
+  url: process.env.NATS_URL || 'nats://localhost:4222',
+  user: process.env.NATS_USER,
+  password: process.env.NATS_PASSWORD,
+  monitoringUrl: process.env.NATS_MONITORING_URL || 'http://localhost:8222',
 }));
diff --git a/apps/credential-manager/src/config/ssi.config.ts b/apps/credential-manager/src/config/ssi.config.ts
index 1779919..408bf27 100644
--- a/apps/credential-manager/src/config/ssi.config.ts
+++ b/apps/credential-manager/src/config/ssi.config.ts
@@ -1,5 +1,5 @@
 import { registerAs } from '@nestjs/config';
 
 export const ssiConfig = registerAs('ssi', () => ({
-  agentUrl: process.env.SSI_AGENT_URL,
+  agentUrl: process.env.SSI_AGENT_URL || 'http://localhost:3010',
 }));
diff --git a/apps/credential-manager/src/config/validation.ts b/apps/credential-manager/src/config/validation.ts
index a7fe2f8..8431e10 100644
--- a/apps/credential-manager/src/config/validation.ts
+++ b/apps/credential-manager/src/config/validation.ts
@@ -1,11 +1,13 @@
 import Joi from 'joi';
 
 export const validationSchema = Joi.object({
-  HTTP_HOST: Joi.string().default('0.0.0.0'),
-  HTTP_PORT: Joi.number().default(3000),
+  HTTP_HOST: Joi.string(),
+  HTTP_PORT: Joi.number(),
 
-  NATS_URL: Joi.string().uri().default('nats://localhost:4222'),
-  NATS_MONITORING_URL: Joi.string().uri().default('http://localhost:8222'),
+  NATS_URL: Joi.string().uri(),
+  NATS_USER: Joi.string().optional(),
+  NATS_PASSWORD: Joi.string().optional(),
+  NATS_MONITORING_URL: Joi.string().uri(),
 
-  SSI_AGENT_URL: Joi.string().default('http://localhost:3010'),
+  SSI_AGENT_URL: Joi.string(),
 });
diff --git a/apps/credential-manager/src/main.ts b/apps/credential-manager/src/main.ts
index 2b5dccd..f2780c9 100644
--- a/apps/credential-manager/src/main.ts
+++ b/apps/credential-manager/src/main.ts
@@ -1,23 +1,36 @@
-import type { MicroserviceOptions } from '@nestjs/microservices';
+/* c8 ignore start */
+import type { ConfigType } from '@nestjs/config';
+import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices';
 
-import { VersioningType } from '@nestjs/common';
-import { ConfigService } from '@nestjs/config';
+import { Logger, VersioningType } from '@nestjs/common';
 import { NestFactory } from '@nestjs/core';
 import { Transport } from '@nestjs/microservices';
 import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
 
 import { Application } from './application.js';
+import { httpConfig } from './config/http.config.js';
+import { natsConfig } from './config/nats.config.js';
 
 const app = await NestFactory.create(Application);
-const configService = app.get(ConfigService);
 app.enableCors();
 
-app.connectMicroservice<MicroserviceOptions>({
+const { url, user, password } = app.get(natsConfig.KEY) as ConfigType<
+  typeof natsConfig
+>;
+
+const microserviceOptions: Required<NatsOptions> = {
   transport: Transport.NATS,
   options: {
-    servers: [configService.get('nats').url],
+    servers: [url],
   },
-});
+};
+
+if (user && password) {
+  microserviceOptions.options.user = user;
+  microserviceOptions.options.pass = password;
+}
+
+app.connectMicroservice<MicroserviceOptions>(microserviceOptions);
 
 app.enableVersioning({
   defaultVersion: ['1'],
@@ -35,4 +48,8 @@ const document = SwaggerModule.createDocument(app, swaggerConfig);
 SwaggerModule.setup('/swagger', app, document);
 await app.startAllMicroservices();
 
-await app.listen(configService.get('PORT') || 3000);
+const { host, port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>;
+await app.listen(port as number, host as string);
+
+Logger.log(`Application is running on: ${await app.getUrl()}`);
+/* c8 ignore stop */
-- 
GitLab