Skip to content
This repository was archived by the owner on May 25, 2023. It is now read-only.

Commit 92caf4e

Browse files
committed
WIP: New logo. Code cleanup.
1 parent beef3e6 commit 92caf4e

14 files changed

+247
-195
lines changed

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The MIT License (MIT)
22

3-
Copyright (c) 2019 Vasanth V
3+
Copyright (c) 2019 Vasanth V <[email protected]>
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

docker/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ COPY package.json /usr/src/app/
55
RUN npm install
66
COPY . /usr/src/app
77
EXPOSE 3000
8-
CMD [ "./utils/wait-for-it.sh", "mongo:27017", "--", "npm", "start" ]
8+
CMD [ "./wait-for-it.sh", "mongo:27017", "--", "npm", "start" ]
File renamed without changes.

package.json

+31-31
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
{
2-
"name": "jsonbox",
3-
"version": "1.0.1",
4-
"description": "Free HTTP based JSON storage.",
5-
"main": "server.js",
6-
"scripts": {
7-
"test": "echo \"Error: no test specified\" && exit 1",
8-
"start": "node server.js"
9-
},
10-
"repository": {
11-
"type": "git",
12-
"url": "git+https://github.com/vasanthv/jsonbox.git"
13-
},
14-
"keywords": [
15-
"json",
16-
"store",
17-
"storage",
18-
"restful"
19-
],
20-
"author": "Vasanth V",
21-
"license": "MIT",
22-
"bugs": {
23-
"url": "https://github.com/vasanthv/jsonbox/issues"
24-
},
25-
"homepage": "https://github.com/vasanthv/jsonbox#readme",
26-
"dependencies": {
27-
"body-parser": "^1.19.0",
28-
"cors": "^2.8.5",
29-
"express": "^4.17.1",
30-
"express-rate-limit": "^5.0.0",
31-
"mongoose": "^5.7.8"
32-
}
2+
"name": "jsonbox",
3+
"version": "2.0.0",
4+
"description": "A Free HTTP based JSON storage.",
5+
"main": "server.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"start": "node server.js"
9+
},
10+
"repository": {
11+
"type": "git",
12+
"url": "git+https://github.com/vasanthv/jsonbox.git"
13+
},
14+
"keywords": [
15+
"json",
16+
"store",
17+
"storage",
18+
"restful"
19+
],
20+
"author": "Vasanth V",
21+
"license": "MIT",
22+
"bugs": {
23+
"url": "https://github.com/vasanthv/jsonbox/issues"
24+
},
25+
"homepage": "https://github.com/vasanthv/jsonbox#readme",
26+
"dependencies": {
27+
"body-parser": "^1.19.0",
28+
"cors": "^2.8.5",
29+
"express": "^4.17.1",
30+
"express-rate-limit": "^5.0.0",
31+
"mongoose": "^5.7.8"
32+
}
3333
}

src/config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
module.exports = {
22
PORT: process.env.PORT || 3000,
33
MONGO_URL: process.env.MONGODB_URI || 'mongodb://localhost:27017/jsonbox-io-dev'
4-
}
4+
};

src/db.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55
module.exports = (() => {
66
let instance;
77
const createInstance = () => {
8-
const mongoose = require("mongoose");
9-
const config = require("./config");
8+
const mongoose = require('mongoose');
9+
const config = require('./config');
1010

11-
mongoose.connect(config.MONGO_URL, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true });
11+
mongoose.connect(config.MONGO_URL, {
12+
useCreateIndex: true,
13+
useNewUrlParser: true,
14+
useUnifiedTopology: true
15+
});
1216
const Schema = mongoose.Schema;
1317

1418
console.log('Data Db initialized');
@@ -23,8 +27,8 @@ module.exports = (() => {
2327
data: { type: Object } // Actual data of the record
2428
});
2529

26-
return mongoose.model("Data", dataSchema);
27-
}
30+
return mongoose.model('Data', dataSchema);
31+
};
2832
return {
2933
getInstance: () => {
3034
if (!instance) {

src/helper.js

+22-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const memorySizeOf = (obj) => {
1+
const memorySizeOf = obj => {
22
// took this function from https://stackoverflow.com/a/50180927/607608
33
var bytes = 0;
44

@@ -26,13 +26,15 @@ const memorySizeOf = (obj) => {
2626
}
2727
}
2828
return bytes;
29-
};
29+
}
3030
return sizeOf(obj);
3131
};
32-
const isValidKeys = (obj) => {
32+
33+
const isValidKeys = obj => {
3334
const keys = Object.keys(obj);
3435
return keys.every(key => /^[A-Za-z]/i.test(key[0]));
35-
}
36+
};
37+
3638
const responseBody = (obj, collection) => {
3739
let response = {};
3840
response['_id'] = obj._id;
@@ -42,15 +44,21 @@ const responseBody = (obj, collection) => {
4244
if (obj._updatedOn) response['_updatedOn'] = obj._updatedOn;
4345
if (!collection && obj._collection) response['_collection'] = obj._collection;
4446
return response;
45-
}
47+
};
4648

47-
const parse_query = (req_q) => {
49+
const parse_query = req_q => {
4850
let query = {};
4951
let q = {};
5052
req_q.split(',').forEach(i => (q[i.split(':')[0]] = i.split(':')[1]));
51-
Object.keys(q).forEach((key) => {
53+
Object.keys(q).forEach(key => {
5254
const value = q[key];
53-
if (value.startsWith('>=') || value.startsWith('<=') || value.startsWith('>') || value.startsWith('<') || value.startsWith('=')) {
55+
if (
56+
value.startsWith('>=') ||
57+
value.startsWith('<=') ||
58+
value.startsWith('>') ||
59+
value.startsWith('<') ||
60+
value.startsWith('=')
61+
) {
5462
// Querying a Number
5563
let val = 0;
5664
if (value.startsWith('>=') || value.startsWith('<=')) val = value.substr(2);
@@ -68,23 +76,23 @@ const parse_query = (req_q) => {
6876
if (value.endsWith('*')) val = val.substr(0, val.length - 1);
6977

7078
let regexp;
71-
if (value.startsWith('*') && value.endsWith('*')) regexp = new RegExp(val, "i");
72-
else if (value.startsWith('*')) regexp = new RegExp(val + '$', "i");
73-
else if (value.endsWith('*')) regexp = new RegExp("^" + val, "i");
79+
if (value.startsWith('*') && value.endsWith('*')) regexp = new RegExp(val, 'i');
80+
else if (value.startsWith('*')) regexp = new RegExp(val + '$', 'i');
81+
else if (value.endsWith('*')) regexp = new RegExp('^' + val, 'i');
7482
query['data.' + key] = regexp;
7583
} else {
7684
if (value == 'true') query['data.' + key] = true;
7785
else if (value == 'false') query['data.' + key] = false;
78-
else query['data.' + key] = new RegExp('^' + value + '$', "i");
86+
else query['data.' + key] = new RegExp('^' + value + '$', 'i');
7987
}
8088
});
8189

8290
return query;
83-
}
91+
};
8492

8593
module.exports = {
8694
memorySizeOf,
8795
isValidKeys,
8896
responseBody,
8997
parse_query
90-
}
98+
};

src/model.js

+36-26
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const Data = require('./db').getInstance();
33

44
const xpost = async (req, res, next) => {
55
try {
6-
const createRecord = async (body) => {
6+
const createRecord = async body => {
77
const date = new Date();
88
let record = { _box: req.box };
99
if (req.collection) record['_collection'] = req.collection;
@@ -12,7 +12,7 @@ const xpost = async (req, res, next) => {
1212
record['data'] = body;
1313
const newRecord = await new Data(record).save();
1414
return helper.responseBody(newRecord, req.collection);
15-
}
15+
};
1616

1717
if (Array.isArray(req.body)) {
1818
const createRecordPromise = req.body.map(createRecord);
@@ -22,7 +22,6 @@ const xpost = async (req, res, next) => {
2222
const newRecord = await createRecord(req.body);
2323
res.json(newRecord);
2424
}
25-
2625
} catch (error) {
2726
next(error);
2827
}
@@ -33,12 +32,12 @@ const xget = async (req, res, next) => {
3332
const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec();
3433
res.json(helper.responseBody(record, req.collection));
3534
} else {
36-
const skip = req.query.skip ? +(req.query.skip) : 0;
37-
let limit = req.query.limit ? +(req.query.limit) : 20;
35+
const skip = req.query.skip ? +req.query.skip : 0;
36+
let limit = req.query.limit ? +req.query.limit : 20;
3837
limit = limit > 1000 ? 1000 : limit;
3938
let sort = req.query.sort ? req.query.sort : '-_createdOn';
4039
if (!['_createdOn', '-_createdOn', '_updatedOn', '-_updatedOn'].includes(sort)) {
41-
sort = (sort[0] === '-') ? '-data.' + sort.substr(1) : 'data.' + sort;
40+
sort = sort[0] === '-' ? '-data.' + sort.substr(1) : 'data.' + sort;
4241
}
4342

4443
let query = {};
@@ -48,26 +47,31 @@ const xget = async (req, res, next) => {
4847
} else if (req.query.query_key && req.query.query_value) {
4948
// soon to be DEPRECATED
5049
let regexp;
51-
const queryType = (typeof req.query.query_type === 'string') ? req.query.query_type.toLowerCase() : null;
50+
const queryType =
51+
typeof req.query.query_type === 'string' ? req.query.query_type.toLowerCase() : null;
5252
switch (queryType) {
5353
case 'startswith':
54-
regexp = new RegExp("^" + req.query.query_value, "i");
54+
regexp = new RegExp('^' + req.query.query_value, 'i');
5555
break;
5656
case 'endswith':
57-
regexp = new RegExp(req.query.query_value + '$', "i");
57+
regexp = new RegExp(req.query.query_value + '$', 'i');
5858
break;
5959
case 'anywhere':
60-
regexp = new RegExp(req.query.query_value, "i");
60+
regexp = new RegExp(req.query.query_value, 'i');
6161
break;
6262
default:
63-
regexp = new RegExp('^' + req.query.query_value + '$', "i");
63+
regexp = new RegExp('^' + req.query.query_value + '$', 'i');
6464
break;
6565
}
6666
query['data.' + req.query.query_key] = regexp;
6767
}
6868
query['_box'] = req.box;
6969
if (req.collection) query['_collection'] = req.collection;
70-
const records = await Data.find(query).skip(skip).limit(limit).sort(sort).exec();
70+
const records = await Data.find(query)
71+
.skip(skip)
72+
.limit(limit)
73+
.sort(sort)
74+
.exec();
7175
res.json(records.map(r => helper.responseBody(r, req.collection)));
7276
}
7377
} catch (error) {
@@ -78,13 +82,18 @@ const xput = async (req, res, next) => {
7882
try {
7983
const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec();
8084
if (record) {
81-
await Data.updateOne({ _id: req.recordId, _box: req.box }, {
82-
_updatedOn: new Date(),
83-
_updatedBy: req.API_SECRET,
84-
data: req.body
85-
});
86-
res.json({ message: "Record updated." });
87-
} else { res.status(400).json({ message: "Invalid record Id" }) }
85+
await Data.updateOne(
86+
{ _id: req.recordId, _box: req.box },
87+
{
88+
_updatedOn: new Date(),
89+
_updatedBy: req.API_SECRET,
90+
data: req.body
91+
}
92+
);
93+
res.json({ message: 'Record updated.' });
94+
} else {
95+
res.status(400).json({ message: 'Invalid record Id' });
96+
}
8897
} catch (error) {
8998
next(error);
9099
}
@@ -95,24 +104,25 @@ const xdelete = async (req, res, next) => {
95104
const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec();
96105
if (record) {
97106
await Data.deleteOne({ _id: req.recordId, _box: req.box });
98-
res.json({ message: "Record removed." });
99-
} else { res.status(400).json({ message: "Invalid record Id" }) }
107+
res.json({ message: 'Record removed.' });
108+
} else {
109+
res.status(400).json({ message: 'Invalid record Id' });
110+
}
100111
} else if (req.query.q) {
101-
const query = helper.parse_query(req.query.q)
112+
const query = helper.parse_query(req.query.q);
102113
query['_box'] = req.box;
103-
114+
104115
const result = await Data.deleteMany(query);
105-
res.json({ message: result.deletedCount + " Records removed." });
116+
res.json({ message: result.deletedCount + ' Records removed.' });
106117
}
107118
} catch (error) {
108119
next(error);
109120
}
110121
};
111122

112-
113123
module.exports = {
114124
xpost,
115125
xget,
116126
xput,
117127
xdelete
118-
}
128+
};

src/routes.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const router = require('express').Router();
2-
const rateLimit = require("express-rate-limit");
2+
const rateLimit = require('express-rate-limit');
33

44
const model = require('./model');
55
const validators = require('./validators');
@@ -11,16 +11,14 @@ router.use(validators.keysValidator);
1111
router.use(validators.extractParams);
1212
router.use(validators.validateParams);
1313

14-
router.post('/*', rateLimit({
15-
windowMs: 60 * 60 * 1000, // In 60 minutes window
16-
max: 100 // only 100 POST requests are allowed
17-
}), model.xpost);
14+
// only 100 POST requests are allowed in 60 minutes window
15+
router.post('/*', rateLimit({ windowMs: 60 * 60 * 1000, max: 100 }), model.xpost);
1816
router.get('/*', model.xget);
1917
router.put('/*', model.xput);
2018
router.delete('/*', model.xdelete);
2119

2220
/**
23-
* DATA endpoints common error handling middleware
21+
* DATA endpoint's common error handling middleware
2422
*/
2523
router.use((err, req, res, next) => {
2624
console.error(err);

0 commit comments

Comments
 (0)