Skip to content

Commit 1b7401f

Browse files
committed
Move flat-file-db implementation to an adapter
1 parent 6aebd25 commit 1b7401f

File tree

7 files changed

+43
-25
lines changed

7 files changed

+43
-25
lines changed

src/db.js

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
const flatfile = require('flat-file-db')
22
const promise = require('promise')
33

4-
const db = flatfile.sync(process.env.DB_NAME || 'views.db')
4+
const adapter = require('./flat-file-adapter');
55

6-
const promisifiedDb = {
7-
// Promisify async operations
8-
put: promise.denodeify(db.put.bind(db)),
9-
del: promise.denodeify(db.del.bind(db)),
10-
clear: promise.denodeify(db.clear.bind(db)),
11-
12-
get: db.get.bind(db),
13-
has: db.has.bind(db),
14-
keys: db.keys.bind(db),
15-
close: db.close.bind(db),
6+
module.exports = {
7+
get: adapter.get,
8+
getAll: adapter.getAll,
9+
put: adapter.put,
10+
has: adapter.has,
1611
}
17-
18-
module.exports = promisifiedDb

src/flat-file-adapter.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const flatfile = require('flat-file-db')
2+
const promise = require('promise')
3+
4+
const db = flatfile.sync(process.env.DB_NAME || 'views.db')
5+
6+
function getAll(options) {
7+
const data = {};
8+
const keys = db.keys()
9+
.filter(key => String(options.filter) === 'false' ? true : key.startsWith(pathname));
10+
11+
return Promise.resolve(keys.map(key => db.get(key)));
12+
}
13+
14+
module.exports = {
15+
get: promise.denodeify(db.get.bind(db)),
16+
put: promise.denodeify(db.put.bind(db)),
17+
has: promise.denodeify(db.has.bind(db)),
18+
getAll: getAll,
19+
}

src/index.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@ module.exports = async function (req, res) {
99
// Send all views down if "?all" is true
1010
if (String(query.all) === 'true') {
1111
const data = {
12-
data: {},
12+
data: await db.getAll(),
1313
time: Date.now()
1414
}
15-
for (let key of db.keys().filter(key => String(query.filter) === 'false' ? true : key.startsWith(pathname))) {
16-
data.data[key] = db.get(key)
17-
}
1815
send(res, 200, data)
1916
return
2017
}
@@ -27,7 +24,7 @@ module.exports = async function (req, res) {
2724
}
2825
const shouldIncrement = String(query.inc) !== 'false'
2926
try {
30-
const currentViews = db.has(pathname) ? db.get(pathname).views.length : 0
27+
const currentViews = await db.has(pathname) ? (await db.get(pathname)).views.length : 0
3128
// Add a view and send the total views back to the client
3229
if (shouldIncrement) {
3330
await pushView(pathname, { time: Date.now() })

src/utils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ const pushView = async (key, view) => {
1010
if (locks[key]) return setImmediate(async () => { await push() })
1111
locks[key] = true
1212

13-
const views = db.has(key)
14-
? db.get(key).views
13+
const views = await db.has(key)
14+
? (await db.get(key)).views
1515
: []
1616

1717
try {

tests/atomicity.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const request = require('request-promise')
22
const { listen, mockDb } = require('./utils')
33

4-
jest.mock('../src/db', () => mockDb)
4+
jest.mock('../src/flat-file-adapter', () => mockDb)
55
const service = require('../src')
66
let url
77

tests/items.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const request = require('request-promise')
22
const { listen, mockDb } = require('./utils')
33

4-
jest.mock('../src/db', () => mockDb)
4+
jest.mock('../src/flat-file-adapter', () => mockDb)
55
const service = require('../src')
66
let url
77

tests/utils.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,24 @@ const DB = () => {
66
let DELAY = 1
77

88
return {
9-
get: (key) => data[key],
9+
get: (key) => new Promise((res, rej) => {
10+
setTimeout(() => {
11+
res(data[key])
12+
}, DELAY)
13+
}),
1014
put: (key, val) => new Promise((res, rej) => {
1115
setTimeout(() => {
1216
data[key] = val
1317
res()
1418
}, DELAY)
1519
}),
16-
has: (key) => !!data[key],
17-
keys: () => Object.keys(data),
20+
has: (key) => new Promise((res, rej) => {
21+
setTimeout(() => {
22+
res(!!data[key])
23+
}, DELAY)
24+
}),
25+
getAll: (options) => Object.assign({}, data),
26+
1827
// Custom methods used in tests
1928
_reset: () => { data = {} },
2029
_setDelay: (ms) => { DELAY = ms || 1 }

0 commit comments

Comments
 (0)