UNPKG

2.21 kBPlain TextView Raw
1import { APIDto } from './api.dto';
2import { Controller, Get, HttpCode, Inject, Req } from '@nestjs/common';
3import { ApiResponse, ApiOperation } from '@nestjs/swagger';
4import { Request } from 'express';
5
6import { LXDHubAPISettings } from '.';
7
8@Controller('/api/v1')
9/**
10 * The root api controller
11 */
12export 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 * Reads the package.json file and returns the parsed object
24 */
25 private async getPackageJson() {
26 const packageJsonPath = this.Path.join(__dirname, '../package.json');
27 // @ts-ignore
28 const packageJson = await this.Fs.readFile(packageJsonPath, 'utf8');
29 return JSON.parse(packageJson);
30 }
31
32 /**
33 * Generates the docurl using the express request object
34 * and the given relative doc url
35 * @param req The express request
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 * Returns general informations about the API.
47 * @param req The express request object
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}