forked from micro-toolkit/api-generator-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
91 lines (77 loc) · 3.04 KB
/
index.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var express = require('express'),
requestIdMiddleware = require('request-id/express')(),
_ = require('lodash'),
modelRoutes = require('./lib/routes').modelRoutes,
relationsRoutes = require('./lib/routes').relationsRoutes,
metadataLoader = require('./lib/metadata'),
partialResponseMiddleware = require('express-partial-response'),
Logger = require('./logger'),
log = Logger.getLogger('micro.api.metadata');
function loadingRoutes(router, newRoutes){
newRoutes.map(function(route){
log.trace('Mount route %s \t%s', route.verb.toUpperCase(), route.path);
// TODO: Include this in path module instead
// this was the only quick solution to avoid route clashes between
// resource get and collection count since the resource get uses wildcard
// that match everything both routes would be executed
// Related with https://github.com/micro-toolkit/api-generator-js/issues/103
var path = (route.verb !== 'get') ? route.path
: route.path.replace(new RegExp('/:id$'), '/:id(?!count)([\\-\\w]+)');
if (route.middleware) {
router[route.verb](path, route.middleware, route.handler);
} else {
router[route.verb](path, route.handler);
}
});
return router;
}
function loadModel(version, versionMetadata){
return _.reduce(versionMetadata, function(memo, metadata, modelName){
var modelData = metadataLoader(version, modelName, metadata);
log.trace('Model \'%s\': %j', modelName, modelData);
memo[modelName] = modelData;
return memo;
}, {});
}
function loadVersion(memo, versionMetadata, version) {
memo[version] = loadModel(version, versionMetadata);
return memo;
}
function loadConfigs(config) {
// TODO: Add unit/integration tests for this loadings and defaults
var conf = _.cloneDeep(config);
var runtimeConf = conf.runtimeConfig;
var excludeQs = runtimeConf.excludeQueryString || 'token,access_token';
runtimeConf.excludeQueryString = excludeQs.split(',');
runtimeConf.claims = (runtimeConf.claims || '').split(',');
return conf;
}
function apiRouter(config){
var router = express.Router();
router.use(requestIdMiddleware);
router.use(partialResponseMiddleware());
// load configs
var conf = loadConfigs(config);
// load models
log.info('Loading API Models...');
conf.metadata = _.reduce(conf.metadata, loadVersion, {});
log.info('Loaded API Models...');
// loading routes
log.info('Loading API model routes...');
Object.keys(conf.metadata).forEach(function(version){
var versionMetadata = conf.metadata[version];
Object.keys(versionMetadata).forEach(function(modelName){
var metadata = versionMetadata[modelName];
var newRoutes = modelRoutes(conf, metadata);
router = loadingRoutes(router, newRoutes);
});
Object.keys(versionMetadata).forEach(function(modelName){
var metadata = versionMetadata[modelName];
var newRoutes = relationsRoutes(conf, metadata);
router = loadingRoutes(router, newRoutes);
});
});
log.info('Loaded API routes...');
return router;
}
module.exports = apiRouter;