1 | import { APIDto } from './api.dto';
|
2 | import { Controller, Get, HttpCode, Inject, Req } from '@nestjs/common';
|
3 | import { ApiResponse, ApiOperation } from '@nestjs/swagger';
|
4 | import { Request } from 'express';
|
5 |
|
6 | import { LXDHubAPISettings } from '.';
|
7 |
|
8 | @Controller('/api/v1')
|
9 |
|
10 |
|
11 |
|
12 | export class AppController {
|
13 | constructor(
|
14 | @Inject('Fs')
|
15 | private Fs,
|
16 | @Inject('Path')
|
17 | private Path,
|
18 | @Inject('LXDHubAPISettings')
|
19 | private appSettings: LXDHubAPISettings
|
20 | ) { }
|
21 |
|
22 | |
23 |
|
24 |
|
25 | private async getPackageJson() {
|
26 | const packageJsonPath = this.Path.join(__dirname, '../package.json');
|
27 |
|
28 | const packageJson = await this.Fs.readFile(packageJsonPath, 'utf8');
|
29 | return JSON.parse(packageJson);
|
30 | }
|
31 |
|
32 | |
33 |
|
34 |
|
35 |
|
36 |
|
37 | private getDocsUrl(req: Request): string | null {
|
38 | if (this.appSettings.docUrl) {
|
39 | return `${req.protocol}://${req.get('host')}${this.appSettings.docUrl}`;
|
40 | } else {
|
41 | return null;
|
42 | }
|
43 | }
|
44 |
|
45 | |
46 |
|
47 |
|
48 |
|
49 | @ApiOperation({ title: 'API Info' })
|
50 | @ApiResponse({ status: 200, type: APIDto })
|
51 | @Get('/')
|
52 | async apiInfo(@Req() req: Request): Promise<APIDto> {
|
53 | let packageJson;
|
54 | try {
|
55 | packageJson = await this.getPackageJson();
|
56 | }
|
57 | catch (ex) {
|
58 | throw HttpCode(500);
|
59 | }
|
60 |
|
61 | return {
|
62 | api_version: '1.0',
|
63 | package_version: packageJson.version,
|
64 | name: packageJson.name,
|
65 | description: packageJson.description,
|
66 | _links: {
|
67 | homepage: packageJson.homepage,
|
68 | bug_report: packageJson.bugs && packageJson.bugs.url || null,
|
69 | repository: packageJson.repository && packageJson.repository.url || null,
|
70 | docs: this.getDocsUrl(req),
|
71 | }
|
72 | };
|
73 | }
|
74 | }
|