Skip to content

Commit 8d019d5

Browse files
committed
Add before after filtering support
1 parent e1275df commit 8d019d5

File tree

6 files changed

+342
-14
lines changed

6 files changed

+342
-14
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"license": "MIT",
2525
"repository": "https://github.com/mxstbr/micro-analytics",
2626
"dependencies": {
27+
"date-fns": "^1.25.0",
2728
"flat-file-db": "^1.0.0",
2829
"micro": "6.1.0",
2930
"promise": "^7.1.1",

src/flat-file-adapter.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
const flatfile = require('flat-file-db')
22
const promise = require('promise')
3+
const dateFns = require('date-fns')
34

45
const db = flatfile.sync(process.env.DB_NAME || 'views.db')
56

67
module.exports = {
78
put: promise.denodeify(db.put.bind(db)),
89

910
has: (key) => Promise.resolve(db.has(key)),
10-
get: (key) => Promise.resolve(db.get(key)),
11+
get: (key, options) => {
12+
const value = db.get(key)
13+
14+
return value.filter(view => {
15+
if (options && options.before && dateFns.isAfter(view.time, options.before)) return false
16+
if (options && options.after && dateFns.isBefore(view.time, options.after)) return false
17+
return true
18+
})
19+
},
1120
keys: () => Promise.resolve(db.keys()),
1221

1322
getAll: async function getAll(options) {
@@ -17,7 +26,7 @@ module.exports = {
1726
keys
1827
.filter(key => key.startsWith(options.pathname))
1928
.forEach((key) => {
20-
data[key] = db.get(key)
29+
data[key] = module.exports.get(key, { before: options.before, after: options.after })
2130
})
2231

2332
return data

src/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ module.exports = async function (req, res) {
1010
if (String(query.all) === 'true') {
1111
try {
1212
const data = {
13-
data: await db.getAll({ pathname: pathname, filter: query.filter }),
13+
data: await db.getAll({
14+
pathname: pathname,
15+
before: query.before,
16+
after: query.after,
17+
}),
1418
time: Date.now()
1519
}
1620
send(res, 200, data)

tests/items.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const request = require('request-promise')
2+
const dateFns = require('date-fns')
23
const { listen, mockDb } = require('./utils')
34

45
jest.mock('flat-file-db', () => mockDb)
@@ -90,5 +91,30 @@ describe('all', () => {
9091
expect(body.data['/rover2'].views).toBeDefined()
9192
expect(body.data['/rover2'].views.length).toBe(1)
9293
})
94+
95+
it('should filter based on before after', async () => {
96+
const baseDate = new Date(2017, 1, 1, 10, 0)
97+
const after = dateFns.addMinutes(baseDate, 11).toISOString()
98+
const before = dateFns.addMinutes(baseDate, 41).toISOString()
99+
100+
const d = dateFns.addMinutes(baseDate, 20)
101+
102+
mockDb._put('/rover', [
103+
{ time: baseDate.getTime() },
104+
{ time: dateFns.addMinutes(baseDate, 10).getTime() },
105+
{ time: dateFns.addMinutes(baseDate, 20).getTime() },
106+
{ time: dateFns.addMinutes(baseDate, 30).getTime() },
107+
{ time: dateFns.addMinutes(baseDate, 40).getTime() },
108+
{ time: dateFns.addMinutes(baseDate, 50).getTime() },
109+
])
110+
111+
const mapToIsoString = view => new Date(view.time).toISOString()
112+
const body = JSON.parse(await request(`${url}/rover?all=true&before=${before}&after=${after}`))
113+
expect(body.data['/rover'].map(mapToIsoString)).toEqual([
114+
'2017-02-01T09:20:00.000Z',
115+
'2017-02-01T09:30:00.000Z',
116+
'2017-02-01T09:40:00.000Z'
117+
])
118+
})
93119
})
94120
})

tests/utils.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const DB = () => {
2020

2121
// Custom methods used in tests
2222
_reset: () => { data = {} },
23-
_setDelay: (ms) => { DELAY = ms || 1 }
23+
_setDelay: (ms) => { DELAY = ms || 1 },
24+
_put: (key, value) => { data[key] = value }
2425
}
2526
}
2627

0 commit comments

Comments
 (0)