From 49eaebe6a4110d8a77a93d9788321f666d7f4d1d Mon Sep 17 00:00:00 2001 From: Tine Jozelj Date: Sun, 15 Jul 2018 12:03:42 +0200 Subject: [PATCH] feat: improved status; added ESI_ENDPOINT to env --- docker-compose.yml | 29 ++++++++++++++----- example.env | 1 + .../core/external/esi/esi.interface.ts | 6 ++++ src/modules/core/external/esi/esi.service.ts | 16 +++++++++- src/modules/core/status/status.controller.ts | 17 +++++++---- src/modules/core/status/status.dto.ts | 20 +++++++++++++ src/modules/core/status/status.interface.ts | 7 +++++ src/modules/core/status/status.module.ts | 11 +++++++ src/modules/core/status/status.service.ts | 22 ++++++++++++++ 9 files changed, 115 insertions(+), 14 deletions(-) create mode 100644 src/modules/core/status/status.dto.ts create mode 100644 src/modules/core/status/status.interface.ts create mode 100644 src/modules/core/status/status.service.ts diff --git a/docker-compose.yml b/docker-compose.yml index 532e4eed..11669a38 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,8 +5,21 @@ services: postgres: image: postgres:latest - redis: - image: redis:latest + esi-nginx: + image: nginx:alpine + volumes: + - ./infra/esi-cache/nginx-esi.conf:/etc/nginx/nginx.conf:ro + + esi-varnish: + image: million12/varnish + environment: + - VCL_CONFIG=/varnish-esi.vcl + volumes: + - ./infra/esi-cache/varnish-esi.vcl:/varnish-esi.vcl:ro + links: + - esi-nginx + depends_on: + - esi-nginx api-image: build: . @@ -25,10 +38,10 @@ services: - /app/src/node_modules links: - postgres - - redis + - esi-varnish depends_on: - postgres - - redis + - esi-varnish updater: command: yarn run start:updater @@ -42,10 +55,10 @@ services: - /app/src/node_modules links: - postgres - - redis + - esi-varnish depends_on: - postgres - - redis + - esi-varnish killmails: command: yarn run start:killmails @@ -59,8 +72,8 @@ services: - /app/src/node_modules links: - postgres - - redis + - esi-varnish depends_on: - postgres - - redis + - esi-varnish \ No newline at end of file diff --git a/example.env b/example.env index 67f5406c..477e262c 100644 --- a/example.env +++ b/example.env @@ -27,3 +27,4 @@ ESI_CLIENT=7sdf771c2casc8das8va78vasd ESI_SECRET=Jb1b3j12jaskjdkjJjhk3jHJhs6Jkj456sdh3 ESI_REDIRECT=http://localhost:3000/authentication/sso/callback ESI_SCOPE=publicData +ESI_ENDPOINT=https://esi.evetech.net/ diff --git a/src/modules/core/external/esi/esi.interface.ts b/src/modules/core/external/esi/esi.interface.ts index 13c86b62..72876d91 100644 --- a/src/modules/core/external/esi/esi.interface.ts +++ b/src/modules/core/external/esi/esi.interface.ts @@ -8,6 +8,12 @@ export enum Categories { solar_system = 'solar_system', } +export interface IGetStatus { + readonly players: number; + readonly server_version: string; + readonly start_time: Date; +} + export interface IGetAlliance { readonly id: number; readonly ticker: string; diff --git a/src/modules/core/external/esi/esi.service.ts b/src/modules/core/external/esi/esi.service.ts index d722cc1b..1448ed11 100644 --- a/src/modules/core/external/esi/esi.service.ts +++ b/src/modules/core/external/esi/esi.service.ts @@ -11,6 +11,7 @@ import { IUniverseCategory, IUniverseGroup, IUniverseName, IUniverseType, + IGetStatus, } from './esi.interface'; import { ESIEntetyNotFoundException } from './esi.exceptions'; import { RequestContext } from '../../requestContext/requestContext'; @@ -19,7 +20,7 @@ import { LoggerService } from '../../logger/logger.service'; @Injectable() export class ESIService { - private static baseUrl = 'https://esi.tech.ccp.is/latest/'; + private static baseUrl = `${process.env.ESI_ENDPOINT}`; private static userAgent = `eve-book/${process.env.npm_package_version}` + ` https://github.com/evebook/api`; private client: AxiosInstance; @@ -36,6 +37,19 @@ export class ESIService { }); } + /** + * Get ESI Status + * @param query + * @return {Promise} + * @url https://esi.evetech.net/ui/#/Status + */ + public async status(): Promise { + return this.request({ + url: 'status/', + method: 'GET', + }); + } + /** * Search for alliances, characters, corporations * @param query diff --git a/src/modules/core/status/status.controller.ts b/src/modules/core/status/status.controller.ts index 283f3227..aae53b61 100644 --- a/src/modules/core/status/status.controller.ts +++ b/src/modules/core/status/status.controller.ts @@ -4,21 +4,28 @@ import { HttpStatus, } from '@nestjs/common'; import { ApiResponse, ApiUseTags } from '@nestjs/swagger'; +import { StatusService } from './status.service'; +import { IStatus } from './status.interface'; +import { DStatus } from './status.dto'; @ApiUseTags('status') @Controller('status') export class StatusController { + constructor( + private statusService: StatusService, + ) { + } + @ApiResponse({ status: HttpStatus.OK, - type: { status: 'OK' }, + type: DStatus, description: 'API Status check', }) @Get() - public async status() { - return { - status: 'OK', - }; + public async status(): Promise { + const status = await this.statusService.status(); + return new DStatus(status); } } diff --git a/src/modules/core/status/status.dto.ts b/src/modules/core/status/status.dto.ts new file mode 100644 index 00000000..6f2ca4fb --- /dev/null +++ b/src/modules/core/status/status.dto.ts @@ -0,0 +1,20 @@ +import { ApiModelProperty } from '@nestjs/swagger'; +import { IStatus } from './status.interface'; +import { IGetStatus } from '../external/esi/esi.interface'; + +export class DStatus { + @ApiModelProperty() + state: 'OK' | 'NOK'; + + @ApiModelProperty() + version: string; + + @ApiModelProperty() + esi: IGetStatus; + + constructor(status: IStatus) { + this.state = status.state; + this.version = status.version; + this.esi = status.esi; + } +} diff --git a/src/modules/core/status/status.interface.ts b/src/modules/core/status/status.interface.ts new file mode 100644 index 00000000..9aed408d --- /dev/null +++ b/src/modules/core/status/status.interface.ts @@ -0,0 +1,7 @@ +import { IGetStatus } from '../external/esi/esi.interface'; + +export interface IStatus { + esi: IGetStatus; + state: 'OK' | 'NOK'; + version: string; +} diff --git a/src/modules/core/status/status.module.ts b/src/modules/core/status/status.module.ts index 63afb7dc..74150868 100644 --- a/src/modules/core/status/status.module.ts +++ b/src/modules/core/status/status.module.ts @@ -1,7 +1,18 @@ import { Module } from '@nestjs/common'; import { StatusController } from './status.controller'; +import { ESIModule } from '../external/esi/esi.module'; +import { StatusService } from './status.service'; @Module({ + imports: [ + ESIModule, + ], + providers: [ + StatusService, + ], + exports: [ + StatusService, + ], controllers: [ StatusController, ], diff --git a/src/modules/core/status/status.service.ts b/src/modules/core/status/status.service.ts new file mode 100644 index 00000000..e0a44a6d --- /dev/null +++ b/src/modules/core/status/status.service.ts @@ -0,0 +1,22 @@ +import { Injectable, Inject } from '@nestjs/common'; +import { ESIService } from '../external/esi/esi.service'; +import { IStatus } from './status.interface'; + +@Injectable() +export class StatusService { + + constructor( + private esiService: ESIService, + ) { + } + + async status(): Promise { + const esiStatus = await this.esiService.status(); + + return { + esi: esiStatus, + state: 'OK', + version: process.env.npm_package_version, + }; + } +}