-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathapp-server.js
73 lines (65 loc) · 3.03 KB
/
app-server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const fs = require('fs');
const path = require('path');
const swaggerParser = require('swagger-parser');
const RestServer = require('@hkube/rest-server');
const log = require('@hkube/logger').GetLogFromContanier();
const { metrics } = require('@hkube/metrics');
require('express-async-errors');
const HttpStatus = require('http-status-codes');
const internal = require('./internal/index');
const swaggerLoader = require('./swagger-loader.js');
const validator = require('../../lib/validation/api-validator');
const component = require('../../lib/consts/componentNames').REST_API;
const afterRequest = require('./middlewares/after-request');
const rest = new RestServer();
class AppServer {
async init(options) {
rest.on('error', (data) => {
const error = data.error || data.message || {};
const { route, jobId, pipelineName } = (data.res && data.res._internalMetadata) || {};
const status = data.status || data.code;
if (status >= HttpStatus.INTERNAL_SERVER_ERROR) {
log.error(`Error response, status=${status}, message=${error}`, { component, route, jobId, pipelineName, httpStatus: status });
}
else {
log.info(`status=${status}, message=${error}`, { component, route, jobId, pipelineName, httpStatus: status });
}
});
const { schemasInternal, ...swagger } = await swaggerLoader.load({ path: path.join(__dirname, 'swagger') });
swagger.info.version = options.version;
const { prefix, port, rateLimit, poweredBy } = options.rest;
const routes = internal();
routes.push(metrics.getRouter());
const versions = fs.readdirSync(path.join(__dirname, 'routes'));
versions.forEach((v) => {
swagger.servers.push({ url: path.join('/', options.swagger.path, prefix, v) });
const routers = fs.readdirSync(path.join(__dirname, 'routes', v));
routers.forEach((f) => {
const file = path.basename(f, '.js');
routes.push({
route: path.join('/', prefix, v, file),
router: require('./' + path.join('routes', v, file))({ ...options, version: v, file }) // eslint-disable-line
});
});
});
await swaggerParser.validate(swagger);
validator.init(swagger.components.schemas, schemasInternal);
const { beforeRoutesMiddlewares, afterRoutesMiddlewares } = metrics.getMiddleware();
const routeLogBlacklist = ['/metrics', '/swagger'];
const opt = {
swagger,
routes,
prefix,
versions,
port: parseInt(port, 10),
rateLimit,
poweredBy,
name: options.serviceName,
beforeRoutesMiddlewares,
afterRoutesMiddlewares: [...afterRoutesMiddlewares, afterRequest(routeLogBlacklist)]
};
const data = await rest.start(opt);
log.info(`🚀 ${data.message}`, { component });
}
}
module.exports = new AppServer();