Skip to content

Commit 8f292aa

Browse files
committed
closes #79 and addes uuid document id's by default
1 parent 9f1a97c commit 8f292aa

8 files changed

Lines changed: 117 additions & 30 deletions

File tree

examples/test-local-lokidb.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ const debug = require('debug')('example.loki-db')
33
const BouncerModel = require('@dataparty/bouncer-model/dist/bouncer-model.json')
44
const Dataparty = require('../src/index.js')
55

6-
76
let local=null
87

98
async function getUser(name) {
@@ -18,6 +17,7 @@ async function main(){
1817
const dbPath = (await fs.mkdtemp('/tmp/loki-party')) + '/loki.db'
1918

2019
debug('db location', dbPath)
20+
console.log(dbPath)
2121

2222
local = new Dataparty.LokiParty({
2323
path: dbPath,
@@ -32,31 +32,40 @@ async function main(){
3232

3333

3434
if(!user){
35-
debug('creating document')
35+
console.log('creating document')
3636
user = await local.createDocument('user', {name: 'tester', created: (new Date()).toISOString() })
3737
}
3838
else{
39-
debug('loaded document')
39+
console.log('loaded document')
4040
}
4141

4242
console.log(user.data)
43+
console.log('hash',user.hash)
4344

44-
user.on('update', (obj)=>{ console.log('update') })
45-
user.on('value', (obj)=>{ console.log('value') })
45+
user.on('update', (obj)=>{ console.log('event [document.on(update)]') })
46+
user.on('value', (obj)=>{ console.log('event [document.on(value)]') })
47+
user.on('remove', (obj)=>{ console.log('event [document.on(remove)]') })
4648

49+
console.log('\nchanging document field')
4750
user.data.name = 'renamed-tester'
4851
await user.save()
4952

5053
console.log(user.data)
54+
console.log('hash',user.hash)
5155

56+
console.log('find document by new field value')
5257
let userFind = await getUser('renamed-tester')
5358

5459
console.log(userFind.data)
60+
console.log('hash',userFind.hash)
5561

62+
console.log('\nchanging document field')
63+
userFind.data.name = 'renamed-tester'
64+
await userFind.save()
5665

57-
console.log(dbPath)
58-
66+
5967

68+
console.log('delete document')
6069
await userFind.remove()
6170

6271

examples/test-local-tingodb.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,32 +31,44 @@ async function main(){
3131

3232

3333
if(!user){
34-
debug('creating document')
34+
console.log('creating document')
3535
user = await local.createDocument('user', {name: 'tester', created: (new Date()).toISOString() })
3636
}
3737
else{
38-
debug('loaded document')
38+
console.log('loaded document')
3939
}
4040

41-
console.log('before', user.data)
41+
console.log(user.data)
42+
console.log('hash',user.hash)
4243

44+
user.on('update', (obj)=>{ console.log('event [document.on(update)]') })
45+
user.on('value', (obj)=>{ console.log('event [document.on(value)]') })
46+
user.on('remove', (obj)=>{ console.log('event [document.on(remove)]') })
47+
48+
console.log('\nchanging document field')
4349
user.data.name = 'renamed-tester'
44-
//user.data.invalideField = true
4550
await user.save()
4651

47-
console.log('after', user.data)
52+
console.log(user.data)
53+
console.log('hash',user.hash)
4854

55+
console.log('find document by new field value')
4956
let userFind = await getUser('renamed-tester')
5057

5158
console.log(userFind.data)
59+
console.log('hash',userFind.hash)
60+
61+
console.log('\nchanging document field')
62+
userFind.data.name = 'renamed-tester'
63+
await userFind.save()
5264

53-
process.exit()
65+
5466

67+
console.log('delete document')
68+
await userFind.remove()
5569

56-
await user.remove()
5770

5871
console.log(await getUser('renamed-tester'))
59-
6072
}
6173

6274

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
"multer": "^1.4.5-lts.1",
9292
"nconf": "^0.10.0",
9393
"node-mocks-http": "^1.12.1",
94+
"node-object-hash": "^3.0.0",
9495
"node-persist": "^3.0.1",
9596
"origin-router": "^1.6.4",
9697
"parse-url": "^5.0.1",

src/bouncer/db/loki-db.js

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const Loki = require('lokijs')
66
const LokiFS = Loki.LokiFsAdapter
77
const LFSA = require('lokijs/src/loki-fs-structured-adapter')
88
const ObjectId = require('bson-objectid')
9+
const uuidv4 = require('uuid/v4')
910

1011
const MongoQuery = require('../mongo-query')
1112
const { promisfy } = require('promisfy')
@@ -26,14 +27,15 @@ const debug = require('debug')('bouncer.db.loki-db')
2627
*/
2728
module.exports = class LokiDb extends IDb {
2829

29-
constructor ({path, factory, dbAdapter, lokiOptions}) {
30+
constructor ({path, factory, dbAdapter, lokiOptions, useUuid}) {
3031
super(factory)
3132
debug('constructor')
3233
this.loki = null
3334
this.lokiOptions = lokiOptions
3435
this.path = path
3536
this.dbAdapter = dbAdapter || new LFSA()
3637
this.error = null
38+
this.useUuid = (useUuid==undefined) ? true : useUuid
3739
}
3840

3941
static get LokiLocalStorageAdapter(){
@@ -142,7 +144,13 @@ module.exports = class LokiDb extends IDb {
142144
ensureId(obj){
143145
let temp = {...obj}
144146
if(!reach(temp,'$meta.id')){
145-
temp.$meta.id = (new ObjectId()).toHexString()
147+
148+
if(this.useUuid){
149+
temp.$meta.id = uuidv4()
150+
}
151+
else{
152+
temp.$meta.id = (new ObjectId()).toHexString()
153+
}
146154
}
147155

148156
let dbDoc = this.documentFromObject(temp)
@@ -232,7 +240,19 @@ module.exports = class LokiDb extends IDb {
232240

233241
for(let obj of docs){
234242
let temp = {...obj}
235-
if(temp._id===undefined){ temp._id = (new ObjectId()).toString(); temp.$meta.id=temp._id; }
243+
if(temp._id===undefined){
244+
245+
if(this.useUuid){
246+
temp._id = uuidv4()
247+
}
248+
else{
249+
temp._id = (new ObjectId()).toHexString()
250+
}
251+
252+
temp.$meta.id=temp._id;
253+
}
254+
255+
236256

237257
let dbDoc = this.documentFromObject(temp)
238258

@@ -311,15 +331,16 @@ module.exports = class LokiDb extends IDb {
311331

312332
const dbDoc = collection.findAndRemove( { '$meta.id': obj.$meta.id } )
313333

314-
debug('dbDoc', dbDoc)
315-
316-
let finalObj = this.documentToObject(dbDoc)
334+
let finalObj = {
335+
$meta: obj.$meta
336+
}
317337

318338
finalObj.$meta.removed = true
319339

320340
this.emitChange(finalObj, 'remove')
321341

322-
debug('obj', finalObj)
342+
debug('finalObj', finalObj)
343+
debug('obj', obj)
323344

324345
await promisfy(this.loki.saveDatabase.bind(this.loki))
325346
return finalObj

src/bouncer/db/tingo-db.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
const IDb = require('../idb')
55
const Hoek = require('@hapi/hoek')
6+
const uuidv4 = require('uuid/v4')
67

78
const {promisfy} = require('promisfy')
89

9-
1010
const debug = require('debug')('bouncer.db.tingo-db')
1111

1212

@@ -20,13 +20,14 @@ const debug = require('debug')('bouncer.db.tingo-db')
2020
*/
2121
module.exports = class TingoDb extends IDb {
2222

23-
constructor ({path, factory, tingoOptions, prefix}) {
23+
constructor ({path, factory, tingoOptions, prefix, useUuid}) {
2424
super(factory, prefix)
2525
debug('constructor path=',path, tingoOptions)
2626
this.tingo = null
2727
this.path = path
2828
this.tingoOptions = tingoOptions || {nativeObjectID: true}
2929
this.error = null
30+
this.useUuid = (useUuid==undefined) ? true : useUuid
3031
}
3132

3233

@@ -92,7 +93,13 @@ module.exports = class TingoDb extends IDb {
9293
ensureId(obj){
9394
let temp = {...obj}
9495
if(!reach(temp,'$meta.id')){
95-
temp.$meta.id = new this.tingo.ObjectID().valueOf()
96+
97+
if(this.useUuid){
98+
temp.$meta.id = uuidv4()
99+
}
100+
else{
101+
temp.$meta.id = new this.tingo.ObjectID().valueOf()
102+
}
96103
}
97104

98105
let dbDoc = this.documentFromObject(temp)
@@ -196,7 +203,17 @@ module.exports = class TingoDb extends IDb {
196203

197204
for(let obj of docs){
198205
let temp = {...obj}
199-
if(temp._id===undefined){ temp._id = (new this.tingo.ObjectID()).toString(); temp.$meta.id=temp._id; }
206+
if(temp._id===undefined){
207+
208+
if(this.useUuid){
209+
temp._id = uuidv4()
210+
}
211+
else{
212+
temp._id = (new this.tingo.ObjectID()).toString();
213+
}
214+
215+
temp.$meta.id=temp._id;
216+
}
200217

201218
let dbDoc = this.documentFromObject(temp)
202219

src/bouncer/db/zango-db.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const Hoek = require('@hapi/hoek')
55
const zango = require('zangodb')
66
const reach = require('../../utils/reach')
77
const ObjectId = require('bson-objectid')
8+
const uuidv4 = require('uuid/v4')
89

910
const MongoQuery = require('../mongo-query')
1011
const { promisfy } = require('promisfy')
@@ -20,12 +21,13 @@ const debug = require('debug')('bouncer.db.zango-db')
2021
*/
2122
module.exports = class ZangoDb extends IDb {
2223

23-
constructor ({dbname, factory}) {
24+
constructor ({dbname, factory, useUuid}) {
2425
super(factory)
2526
debug('constructor')
2627
this.zango = null
2728
this.dbname = dbname
2829
this.error = null
30+
this.useUuid = (useUuid==undefined) ? true : useUuid
2931
}
3032

3133

@@ -105,7 +107,13 @@ module.exports = class ZangoDb extends IDb {
105107
ensureId(obj){
106108
let temp = {...obj}
107109
if(!reach(temp,'$meta.id')){
108-
temp.$meta.id = (new ObjectId()).toHexString()
110+
111+
if(this.useUuid){
112+
temp.$meta.id = uuidv4()
113+
}
114+
else{
115+
temp.$meta.id = (new ObjectId()).toHexString()
116+
}
109117
}
110118

111119
let dbDoc = this.documentFromObject(temp)

src/party/idocument.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const reach = require('../utils/reach')
44
const debug = require('debug')('dataparty.idocument')
55
const EventEmitter = require('eventemitter3')
6+
const objectHasher = require('node-object-hash').hasher()
67

78
class IDocument extends EventEmitter {
89

@@ -116,6 +117,15 @@ class IDocument extends EventEmitter {
116117
return obj
117118
}
118119

120+
/**
121+
* hash of `document.data` using sha256
122+
* @member module:Party.IDocument.hash
123+
* @type {object}
124+
*/
125+
get hash(){
126+
return objectHasher.hash(this.data)
127+
}
128+
119129
/**
120130
* @async
121131
* Merge fields into document
@@ -193,7 +203,9 @@ class IDocument extends EventEmitter {
193203
*
194204
*/
195205
async remove(){
196-
debug('removing document ', this.data.type, this.data.id)
206+
debug('removing document ', this.type, this.id)
207+
208+
//this.emit('remove', this)
197209

198210
return this.party.remove(this.data)
199211
}

src/party/loki-cache.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ module.exports = class LokiCache extends EventEmitter {
3232
}
3333

3434
remove(type, id){
35+
console('cache remove')
3536
debug('remove', type, id)
3637
var collection = this.db.getCollection(type)
3738

@@ -51,6 +52,10 @@ module.exports = class LokiCache extends EventEmitter {
5152
debug('remove CATCH -', exception)
5253
collection.findAndRemove({'$meta.id': id})
5354
}
55+
56+
debug('remove found', found)
57+
58+
this._emitChange(found, 'remove')
5459
}
5560

5661
var item = this.findById(type, id)
@@ -115,9 +120,11 @@ module.exports = class LokiCache extends EventEmitter {
115120
catch(err){
116121
debug('WARN', err)
117122
}
118-
this._emitChange(msg, 'remove')
119123
}
120124

125+
debug('emit remove', msg)
126+
this._emitChange(msg, 'remove')
127+
121128
// otherwise insert new message (remove old message if it exists)
122129
} else {
123130

0 commit comments

Comments
 (0)