-Json Delta service
This exercise is from an actual report on ClanHR. The objective is to build a service that tracks model changes and lists them. The service will receive two user versions, as json:
// old
{"_id": 1,
"name": "Bruce Norries",
"address": {"street": "Some street"}}
// new
{"_id": 1,
"name": "Bruce Willis",
"address": {"street": "Nakatomi Plaza"}}
Note that these json bags can be big and with several nested objects.
After that, a listing endpoint should be made available that returns a collection of data in the form:
[{"field": "name", "old": "Bruce Norris", "new": "Bruce Willis"},
{"field": "address.street", "old": "Some Street", "new": "Nakatomi Plaza"}]
Note that the listing should be filtered by start date and end date, and that we only want a change per user/field on that timespan. So for the given events:
March: Name from A to B
March: Name from B to C
June: Name from C to D
If we filter for March, we should get only one change:
[{"field": "name", "old": "A", "new": "C"}]
Create two endpoints, one to register json model the changes, and another to list the changes based on a start/end date filter.
/add {"id":1,"name":"foo"}
/add [{"id":1,"name":"bar"},{"id":2,"name":"foobar"}]
// if no interval is passed filter all
/diff -d {"start":"2017-01-01", end:"2017-01-01"} // all changes from all objects that occurend in between timeinterval
/diff -d {"_id":1,start":"2017-01-01", end:"2017-01-01"} //all changes for obj id 1, in between time interval
Assumptions:
Will use the field _id, to identify same objects for comparing
Will user the field _timestamp, to identify object change, if not present will add to object
stateless service, no cache, no data persistence
todo
npm install
npm test
npm start
or using docker
docker pull darkua/json-delta
Go into scripts dir and you can run ./add.sh to register data, and you cand diff the data running ./diff.sh
I add benchmarck script to add a large json file, and diff the contents
timer ./benchmark.sh