Skip to content

Commit

Permalink
feat: add openapi documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
noctua84 committed Jan 3, 2024
1 parent b9e3440 commit 7b61a03
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 4 deletions.
4 changes: 3 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { FeatureConfigService } from './config/featureconfig/featureconfig.servi
import { PrismaModule } from './prisma/prisma.module';
import { MetricsService } from './monitoring/metrics/metrics.service';
import { PrismaService } from './prisma/prisma.service';
import appConfig, { appConfigSchema } from './config/app.config';

@Module({
imports: [
Expand All @@ -28,11 +29,12 @@ import { PrismaService } from './prisma/prisma.service';
isGlobal: true,
cache: true,
expandVariables: true,
load: [serverConfig, monitoringConfig],
load: [serverConfig, monitoringConfig, appConfig],
validationSchema: Joi.object({
...serverConfigSchema,
...metricsConfigSchema,
...healthCheckConfigSchema,
...appConfigSchema,
}),
}),
MetricsModule,
Expand Down
14 changes: 14 additions & 0 deletions src/config/app.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { registerAs } from '@nestjs/config';
import Joi from 'joi';

export default registerAs('app', () => ({
name: process.env.npm_package_name,
description: process.env.npm_package_description,
version: process.env.npm_package_version,
}));

export const appConfigSchema = {
NAME: Joi.string(),
DESCRIPTION: Joi.string(),
VERSION: Joi.string(),
};
17 changes: 15 additions & 2 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,30 @@ import { NestFactory, PartialGraphHost } from '@nestjs/core';
import { AppModule } from './app.module';
import { writeFileSync } from 'fs';
import { ConfigService } from '@nestjs/config';
import { DocumentBuilder, OpenAPIObject, SwaggerModule } from '@nestjs/swagger';
import { INestApplication } from '@nestjs/common';

async function bootstrap() {
const app = await NestFactory.create(AppModule, {
const app: INestApplication = await NestFactory.create(AppModule, {
snapshot: true,
abortOnError: false,
});

const configService = app.get(ConfigService);
const configService: ConfigService<any, boolean> = app.get(ConfigService);
const port = configService.get('server.port');
const hostName = configService.get('server.hostname');

const docsConfig: Omit<OpenAPIObject, 'paths'> = new DocumentBuilder()
.setTitle(configService.get('app.name'))
.setDescription(configService.get('app.description'))
.setVersion(configService.get('app.version'))
.build();
const document: OpenAPIObject = SwaggerModule.createDocument(
app,
docsConfig,
);
SwaggerModule.setup('documentation', app, document);

await app.listen(port, hostName);
}

Expand Down
6 changes: 5 additions & 1 deletion src/monitoring/health/health.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Controller, Get, Inject } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import {
HealthCheck,
HealthCheckResult,
HealthCheckService,
HttpHealthIndicator,
} from '@nestjs/terminus';
Expand All @@ -16,11 +17,14 @@ export class HealthController {

@Get()
@HealthCheck()
check() {
check(): Promise<HealthCheckResult> {
const indicators = [];
const baseUrl = this.config.get('server.baseUrl');

indicators.push(() => this.http.pingCheck('API', `${baseUrl}/`));
indicators.push(() =>
this.http.pingCheck('Documentation', `${baseUrl}/documentation`),
);

return this.health.check(indicators);
}
Expand Down

0 comments on commit 7b61a03

Please sign in to comment.