diff --git a/package-lock.json b/package-lock.json index 40857de807..5d8496b4b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4660,12 +4660,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4680,17 +4682,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4807,7 +4812,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4819,6 +4825,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4833,6 +4840,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4840,12 +4848,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4864,6 +4874,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4944,7 +4955,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4956,6 +4968,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5077,6 +5090,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 134f8cd43e..1727c938e6 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -52,6 +52,7 @@ import { PassportComponent } from './homepage/pages/recipes/passport/passport.co import { SqlSequelizeComponent } from './homepage/pages/recipes/sql-sequelize/sql-sequelize.component'; import { SqlTypeormComponent } from './homepage/pages/recipes/sql-typeorm/sql-typeorm.component'; import { SwaggerComponent } from './homepage/pages/recipes/swagger/swagger.component'; +import { TerminusComponent } from './homepage/pages/recipes/terminus/terminus.component'; import { SupportComponent } from './homepage/pages/support/support.component'; import { AuthenticationComponent } from './homepage/pages/techniques/authentication/authentication.component'; import { CachingComponent } from './homepage/pages/techniques/caching/caching.component'; @@ -320,6 +321,11 @@ const routes: Routes = [ component: MongodbComponent, data: { title: 'MongoDB (Mongoose)' }, }, + { + path: 'recipes/terminus', + component: TerminusComponent, + data: { title: 'Terminus' }, + }, /*{ path: 'recipes/mockgoose', component: MockgooseComponent, @@ -489,4 +495,4 @@ const routes: Routes = [ ], exports: [RouterModule], }) -export class AppRoutingModule {} +export class AppRoutingModule { } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2ec4b82eb7..17e99aa4f5 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -91,6 +91,7 @@ import { CompressionComponent } from './homepage/pages/techniques/compression/co import { ValidationComponent } from './homepage/pages/techniques/validation/validation.component'; import { CachingComponent } from './homepage/pages/techniques/caching/caching.component'; import { SerializationComponent } from './homepage/pages/techniques/serialization/serialization.component'; +import { TerminusComponent } from './homepage/pages/recipes/terminus/terminus.component'; const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = { suppressScrollX: true, @@ -149,6 +150,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = { MockgooseComponent, PassportComponent, SwaggerComponent, + TerminusComponent, CqrsComponent, TabsComponent, ExtensionPipe, diff --git a/src/app/homepage/menu/menu.component.ts b/src/app/homepage/menu/menu.component.ts index b22138715b..72aba4bc72 100644 --- a/src/app/homepage/menu/menu.component.ts +++ b/src/app/homepage/menu/menu.component.ts @@ -139,6 +139,7 @@ export class MenuComponent implements OnInit { // { title: 'Authentication (Passport)', path: '/recipes/passport' }, { title: 'CQRS', path: '/recipes/cqrs' }, { title: 'OpenAPI (Swagger)', path: '/recipes/swagger' }, + { title: 'Health Checks (Terminus)', path: '/recipes/terminus'} ], }, { diff --git a/src/app/homepage/pages/recipes/terminus/terminus.component.html b/src/app/homepage/pages/recipes/terminus/terminus.component.html new file mode 100644 index 0000000000..9e76d83775 --- /dev/null +++ b/src/app/homepage/pages/recipes/terminus/terminus.component.html @@ -0,0 +1,25 @@ +
+

Health Checks (Terminus)

+

+ Godaddys JavaScript library @godaddy/terminus adds graceful shutdown and Kubernetes readiness / liveness checks for any HTTP applications. + Therefore it is compatible with NestJS using @nestjs/terminus. Lets get started by installing the required dependencies. +

+
{{ dependencies }}
+

Health Check

+

+ The first step we need to do is to setup a service, which will handle the health checks. +

+ health.service.ts +
{{ healthService }}
+

+ Once we have set up our HealthService, we can import the TerminusModule into the root ApplicationModule. + The HealthService will all provide the settings, which will be used by the TerminusModule +

+ app.module.ts +
{{ appModule }}
+
+ Hint + If done correctly Nest will expose the defined health check(s), which are reachable through a GET request to the defined route. For example curl -X GET 'http://localhost:3000/health' +
+

Listen to System Signals (IPC)

+
diff --git a/src/app/homepage/pages/recipes/terminus/terminus.component.ts b/src/app/homepage/pages/recipes/terminus/terminus.component.ts new file mode 100644 index 0000000000..c0747f9117 --- /dev/null +++ b/src/app/homepage/pages/recipes/terminus/terminus.component.ts @@ -0,0 +1,49 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BasePageComponent } from '../../page/page.component'; + +@Component({ + selector: 'app-terminus', + templateUrl: './terminus.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TerminusComponent extends BasePageComponent { + get dependencies() { + return ` +$ npm install --save @nestjs/terminus @godaddy/terminus`; + } + + get healthService() { + return ` +import { Injectable } from '@nestjs/common'; +import { TerminusOptions, TerminusOptionsFactory } from '@nestjs/terminus'; + +@Injectable() +export class HealthService implements TerminusOptionsFactory { + async health() { + return true; + } + + async createTerminusOptions(): Promise { + return { + healthChecks: { '/health': this.health } + }; + } +}`; + } + + get appModule() { + return ` +import { Module } from '@nestjs/common'; +import { TerminusModule } from '@nestjs/terminus'; + +@Module({ + imports: [ + TerminusModule.forRootAsync({ + useClass: TerminusService, + }), + ], +}) +export class ApplicationModule {}`; + } + +} diff --git a/src/app/homepage/pages/recipes/terminus/terminus.spec.ts b/src/app/homepage/pages/recipes/terminus/terminus.spec.ts new file mode 100644 index 0000000000..743f23888e --- /dev/null +++ b/src/app/homepage/pages/recipes/terminus/terminus.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TerminusComponent } from './terminus.component'; + +describe('TerminusComponent', () => { + beforeEach(async(() => { + return TestBed.configureTestingModule({ + declarations: [ TerminusComponent ] + }) + .compileComponents(); + })); + + let fixture: ComponentFixture; + let component: TerminusComponent; + beforeEach(() => { + fixture = TestBed.createComponent(TerminusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +});