Skip to content

Commit d616a6e

Browse files
authored
Merge pull request #85 from pharindoko/feat-add-jsonfile-path-setting
feat(settings): added possiblity to set path of json file which will …
2 parents 9768f6f + 0c36ffa commit d616a6e

File tree

9 files changed

+94
-62
lines changed

9 files changed

+94
-62
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ curl -H "x-api-key: {API-KEY}" -H "Content-Type: application/json" https://xxxxx
170170
| readOnly | Make API readonly - all API - write operations are forbidden (http 403)) | string |false |
171171
| enableSwagger | Enable swagger and swagger UI support | string | true |
172172
| enableApiKeyAuth | Make your routes private by using an additional ApiKey | boolean | false |
173+
| jsonFile | path of json file that will be used | string | db.json |
173174

174175
## Used Packages
175176

config/appconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"readOnly": false,
33
"enableSwagger": true,
4-
"enableApiKeyAuth": false
4+
"enableApiKeyAuth": false,
5+
"jsonFile": "db.json"
56
}
67

src/utils.js renamed to src/core.js

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,47 @@ const jsonServer = require('json-server');
66
const { logger } = require('./logger');
77
const swagger = require('./swagger/swagger');
88

9-
10-
const defaultDB = JSON.parse(fs.readFileSync('./db.json', 'UTF-8'));
119
const appConfig = JSON.parse(fs.readFileSync('./config/appconfig.json', 'UTF-8'));
12-
1310
const server = express();
14-
1511
let storage = null;
16-
17-
12+
let defaultDB = null;
1813
function setupServer(middlewares, router) {
1914
if (appConfig.enableSwagger) {
2015
middlewares.splice(middlewares.findIndex((x) => x.name === 'serveStatic'), 1);
2116
}
2217
server.use(middlewares);
2318
server.use('/api', router);
24-
if (appConfig.enableSwagger) {
25-
swagger.generateSwagger(server, defaultDB, appConfig);
26-
}
2719
}
2820

29-
function startLocal() {
21+
async function initializeLayers() {
22+
const adapter = await low(storage);
23+
const router = jsonServer.router(adapter);
24+
const middlewares = jsonServer.defaults({ readOnly: appConfig.readOnly });
25+
return { middlewares, router };
26+
}
27+
28+
function startLocal(db) {
3029
logger.info('start locals environment');
31-
const router = jsonServer.router('db.json');
30+
const router = jsonServer.router(db);
3231
const middlewares = jsonServer.defaults({ readOnly: appConfig.readOnly });
33-
setupServer(middlewares, router);
32+
setupServer(middlewares, router, db);
3433
}
3534

36-
function startInCloud() {
35+
function startInCloud(db) {
3736
logger.info(`S3File: ${process.env.S3File}`);
3837
logger.info(`S3Bucket: ${process.env.S3Bucket}`);
3938
logger.info(`readOnly: ${appConfig.readOnly}`);
4039
logger.info(`basePath: ${process.env.basePath}`);
4140
storage = new AwsAdapter(process.env.S3File, {
42-
defaultValue: defaultDB,
41+
defaultValue: db,
4342
aws: { bucketName: process.env.S3Bucket },
4443
});
4544
}
4645

4746
const request = async () => {
4847
try {
49-
const adapter = await low(storage);
50-
const router = jsonServer.router(adapter);
51-
const middlewares = jsonServer.defaults({ readOnly: appConfig.readOnly });
52-
setupServer(middlewares, router);
48+
const { middlewares, router } = await initializeLayers();
49+
setupServer(middlewares, router, defaultDB);
5350
} catch (e) {
5451
if (e.code === 'ExpiredToken') {
5552
logger.error(`Please add valid credentials for AWS. Error: ${e.message}`);
@@ -59,20 +56,36 @@ const request = async () => {
5956
}
6057
};
6158

62-
function init() {
59+
const init = async () => {
6360
logger.info(`NODE_ENV: ${process.env.NODE_ENV}`);
61+
6462
if (process.env.NODE_ENV === 'local' || process.env.NODE_ENV === 'debug') {
65-
startLocal(3000);
63+
defaultDB = JSON.parse(fs.readFileSync(appConfig.jsonFile, 'UTF-8'));
64+
startLocal(defaultDB);
6665
} else if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'offline') {
6766
logger.info('start development mode');
6867
logger.info('load variables from .env file');
6968
// eslint-disable-next-line global-require
7069
require('dotenv').config();
71-
startInCloud();
70+
defaultDB = JSON.parse(fs.readFileSync(process.env.S3File, 'UTF-8'));
71+
startInCloud(defaultDB);
72+
const { middlewares, router } = await initializeLayers();
73+
setupServer(middlewares, router);
7274
} else {
73-
startInCloud();
75+
defaultDB = JSON.parse(fs.readFileSync(process.env.S3File, 'UTF-8'));
76+
startInCloud(defaultDB);
77+
const { middlewares, router } = await initializeLayers();
78+
setupServer(middlewares, router);
7479
}
75-
}
76-
init();
80+
if (appConfig.enableSwagger) {
81+
swagger.generateSwagger(server, defaultDB, appConfig, true);
82+
}
83+
};
7784

78-
module.exports = { server, request };
85+
server.use('/reload', async () => {
86+
await init();
87+
});
88+
89+
module.exports = {
90+
server, request, init,
91+
};

src/handler.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
require('@babel/polyfill');
22
const serverless = require('serverless-http');
33
const { logger } = require('./logger');
4-
const app = require('./utils');
4+
const core = require('./core');
55

66
function start(server, port) {
77
// start the web server
88
server.listen(port);
99
logger.info(`JSON Server is running under port ${port}. Use http://localhost:${port} to access it`);
1010
}
1111

12-
const handler = serverless(app.server);
12+
const handler = serverless(core.server);
1313
module.exports.handler = async (event, context) => {
14-
await app.request();
14+
await core.request();
1515
const result = await handler(event, context);
1616
return result;
1717
};
18-
19-
if (require.main === module) {
20-
if (process.env.NODE_ENV === 'local' || process.env.NODE_ENV === 'debug') {
21-
start(app.server, 3000);
22-
} else if (process.env.NODE_ENV === 'development') {
23-
(async () => {
24-
await app.request();
25-
start(app.server, 3000);
26-
})();
27-
} else {
28-
app.request();
18+
(async () => {
19+
await core.init();
20+
if (require.main === module) {
21+
if (process.env.NODE_ENV === 'local' || process.env.NODE_ENV === 'debug') {
22+
start(core.server, 3000);
23+
} else if (process.env.NODE_ENV === 'development') {
24+
await core.request();
25+
start(core.server, 3000);
26+
} else {
27+
await core.request();
28+
}
2929
}
30-
}
30+
})();

src/output.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function output(data) {
2+
console.log('Received Stack Output', data);
3+
}
4+
5+
module.exports = { output };

src/swagger/swagger.js

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,27 @@ const swaggerSpec = require('./swaggerspec');
44
const swaggerDefGen = require('./swagdefgen');
55
const { logger } = require('../logger');
66

7-
module.exports.generateSwagger = (server, json, config) => {
8-
logger.info('init Swagger');
9-
const swaggerSchemaDefinitions = swaggerDefGen.generateDefinitions(json);
10-
const spec = swaggerSpec.getSpec(server, {}, config.readOnly);
11-
const auth = {
12-
securityDefinitions: {
13-
apiKeyHeader: {
14-
type: 'apiKey',
15-
in: 'header',
16-
name: 'x-api-key',
17-
description: 'All requests must include the `x-api-key` header containing your account ID.',
7+
let spec = null;
8+
module.exports.generateSwagger = (server, json, config, force) => {
9+
if (!spec || force) {
10+
logger.info('init Swagger');
11+
const swaggerSchemaDefinitions = swaggerDefGen.generateDefinitions(json);
12+
spec = swaggerSpec.getSpec(server, {}, config.readOnly);
13+
const auth = {
14+
securityDefinitions: {
15+
apiKeyHeader: {
16+
type: 'apiKey',
17+
in: 'header',
18+
name: 'x-api-key',
19+
description: 'All requests must include the `x-api-key` header containing your account ID.',
20+
},
1821
},
19-
},
20-
};
21-
if (config.enableApiKeyAuth) {
22-
swaggerSpec.addAuthentication(spec, auth);
22+
};
23+
if (config.enableApiKeyAuth) {
24+
swaggerSpec.addAuthentication(spec, auth);
25+
}
26+
swaggerSpec.addSchemaDefitions(spec, swaggerSchemaDefinitions);
2327
}
24-
swaggerSpec.addSchemaDefitions(spec, swaggerSchemaDefinitions);
25-
2628
server.use('/api-spec', (req, res) => {
2729
res.setHeader('Content-Type', 'application/json');
2830
res.send(spec, null, 2);

tests/test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
const request = require('supertest');
2-
const app = require('../dist/utils.js');
2+
const app = require('../dist/core');
3+
4+
(async () => {
5+
await app.init();
6+
})();
37

48
describe('Test the root path', () => {
59
test('It should response the GET method', async () => {

webpack.config.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ const NodeEnvPlugin = require('node-env-webpack-plugin');
55
const NodemonPlugin = require('nodemon-webpack-plugin');
66
const TerserPlugin = require('terser-webpack-plugin');
77
const { join } = require('path');
8+
const fs = require('fs');
9+
10+
const appConfig = JSON.parse(fs.readFileSync('./config/appconfig.json', 'UTF-8'));
811

912
module.exports = {
1013
mode: 'development',
1114
plugins: [
1215
new CopyPlugin([
13-
{ from: './db.json', to: './db.json' },
16+
{ from: appConfig.jsonFile, to: './db.json' },
1417
{ from: './config/appconfig.json', to: './config/appconfig.json' },
1518
]),
1619
new NodeEnvPlugin({
1720
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
1821
}),
19-
process.env.NODE_ENV === 'debug' ? new NodemonPlugin({ nodeArgs: ['--inspect-brk'] }) : new NodemonPlugin(),
22+
process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development' ? new NodemonPlugin({ nodeArgs: ['--inspect-brk'] }) : new NodemonPlugin(),
2023
],
2124
entry: { 'src/handler': './src/handler.js' },
2225
optimization: {

webpack.config.prod.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ const nodeExternals = require('webpack-node-externals');
22
const CopyPlugin = require('copy-webpack-plugin');
33
const TerserPlugin = require('terser-webpack-plugin');
44
const webpack = require('webpack');
5+
const fs = require('fs');
6+
7+
const appConfig = JSON.parse(fs.readFileSync('./config/appconfig.json', 'UTF-8'));
58

69
module.exports = {
710
mode: 'production',
@@ -11,7 +14,7 @@ module.exports = {
1114
DEBUG: false,
1215
}),
1316
new CopyPlugin([
14-
{ from: './db.json', to: './db.json' },
17+
{ from: appConfig.jsonFile, to: './db.json' },
1518
{ from: './config/appconfig.json', to: './config/appconfig.json' },
1619
]),
1720
],

0 commit comments

Comments
 (0)