Skip to content

Commit

Permalink
fix: PouchDB & Hoodie properties
Browse files Browse the repository at this point in the history
BREAKING CHANGE:

We no longer map PouchDB’s `._id` property to `.id`, instead we pass trough docs from PouchDB 1:1.
Also the timestamps are now all namespaced with `.hoodie`
  • Loading branch information
gr2m committed Mar 4, 2017
1 parent 366ac80 commit d462a7d
Show file tree
Hide file tree
Showing 24 changed files with 125 additions and 130 deletions.
3 changes: 1 addition & 2 deletions lib/find-all.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
'use strict'

var toObject = require('./utils/to-object')
var isntDesignDoc = require('./utils/isnt-design-doc')

module.exports = findAll
Expand Down Expand Up @@ -30,7 +29,7 @@ function findAll (state, prefix, filter) {
var objects = res.rows
.filter(isntDesignDoc)
.map(function (row) {
return toObject(row.doc)
return row.doc
})

return typeof filter === 'function'
Expand Down
2 changes: 1 addition & 1 deletion lib/find-or-add.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module.exports = findOrAdd
* with passed properties.
*
* @param {String} prefix optional id prefix
* @param {String|Object} idOrObject id or object with `.id` property
* @param {String|Object} idOrObject id or object with `._id` property
* @param {Object} [properties] Optional properties if id passed
* as first option
* @return {Promise}
Expand Down
2 changes: 1 addition & 1 deletion lib/find.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module.exports = find
*
* @param {String} prefix optional id prefix
* @param {String|Object} idOrObject Id of object or object with
* `.id` property
* `._id` property
* @return {Promise}
*/
function find (state, prefix, objectsOrIds) {
Expand Down
25 changes: 13 additions & 12 deletions lib/helpers/add-many.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
'use strict'

var uuid = require('pouchdb-utils').uuid
var utils = require('pouchdb-utils')

var toDoc = require('../utils/to-doc')
var addTimestamps = require('../utils/add-timestamps')

module.exports = function addMany (state, objects, prefix) {
objects.forEach(addTimestamps)
module.exports = function addMany (state, docs, prefix) {
docs = docs.map(function (doc) {
doc = utils.extend({}, doc)
delete doc.hoodie
return addTimestamps(doc)
})

if (prefix) {
objects.forEach(function (object) {
object.id = prefix + (object.id || uuid())
docs.forEach(function (doc) {
doc._id = prefix + (doc._id || utils.uuid())
})
}

var docs = objects.map(toDoc)

return state.db.bulkDocs(docs)

.then(function (responses) {
return responses.map(function (response, i) {
if (response instanceof Error) {
if (response.status === 409) {
var conflict = new Error('Object with id "' + objects[i].id + '" already exists')
var conflict = new Error('Object with id "' + docs[i]._id + '" already exists')
conflict.name = 'Conflict'
conflict.status = 409
return conflict
Expand All @@ -31,9 +32,9 @@ module.exports = function addMany (state, objects, prefix) {
}
}

objects[i].id = response.id
objects[i]._rev = response.rev
return objects[i]
docs[i]._id = response.id
docs[i]._rev = response.rev
return docs[i]
})
})
}
27 changes: 15 additions & 12 deletions lib/helpers/add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,38 @@

var PouchDBErrors = require('pouchdb-errors')
var Promise = require('lie')
var uuid = require('pouchdb-utils').uuid
var utils = require('pouchdb-utils')

var toDoc = require('../utils/to-doc')
var addTimestamps = require('../utils/add-timestamps')

module.exports = function addOne (state, object, prefix) {
if (typeof object !== 'object') {
module.exports = function addOne (state, doc, prefix) {
if (typeof doc !== 'object') {
return Promise.reject(PouchDBErrors.NOT_AN_OBJECT)
}

if (!object.id) {
object.id = uuid()
doc = utils.extend({}, doc)

if (!doc._id) {
doc._id = utils.uuid()
}

if (prefix) {
object.id = prefix + object.id
doc._id = prefix + doc._id
}

return state.db.put(toDoc(addTimestamps(object)))
delete doc.hoodie

return state.db.put(addTimestamps(doc))

.then(function (response) {
object.id = response.id
object._rev = response.rev
return object
doc._id = response.id
doc._rev = response.rev
return doc
})

.catch(function (error) {
if (error.status === 409) {
var conflict = new Error('Object with id "' + object.id + '" already exists')
var conflict = new Error('Object with id "' + doc._id + '" already exists')
conflict.name = 'Conflict'
conflict.status = 409
throw conflict
Expand Down
3 changes: 1 addition & 2 deletions lib/helpers/find-many.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict'

var toId = require('../utils/to-id')
var toObject = require('../utils/to-object')

module.exports = function findMany (state, idsOrObjects, prefix) {
var ids = idsOrObjects.map(toId)
Expand Down Expand Up @@ -31,6 +30,6 @@ module.exports = function findMany (state, idsOrObjects, prefix) {
return missing
})

return docs.map(toObject)
return docs
})
}
3 changes: 0 additions & 3 deletions lib/helpers/find-one.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict'

var toId = require('../utils/to-id')
var toObject = require('../utils/to-object')

module.exports = function findOne (state, idOrObject, prefix) {
var id = toId(idOrObject)
Expand All @@ -12,8 +11,6 @@ module.exports = function findOne (state, idOrObject, prefix) {

return state.db.get(id)

.then(toObject)

.catch(function (error) {
if (error.status === 404) {
var missing = new Error('Object with id "' + id + '" is missing')
Expand Down
4 changes: 2 additions & 2 deletions lib/helpers/find-or-add-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ module.exports = function findOrAddMany (state, passedObjects, prefix) {

var foundObjectIds = foundObjects.map(toId)
var notFoundObjects = passedObjects.reduce(function (notFoundObjects, passedObject) {
if (foundObjectIds.indexOf((prefix || '') + passedObject.id) === -1) {
if (foundObjectIds.indexOf((prefix || '') + passedObject._id) === -1) {
notFoundObjects.push(passedObject)
}
return notFoundObjects
Expand All @@ -32,7 +32,7 @@ module.exports = function findOrAddMany (state, passedObjects, prefix) {
var objects = []

foundObjects.concat(addedObjects).forEach(function (object) {
var index = passedObjectIds.indexOf(object.id)
var index = passedObjectIds.indexOf(object._id)
objects[index] = object
})

Expand Down
2 changes: 1 addition & 1 deletion lib/helpers/find-or-add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function findOrAddOne (state, idOrObject, newObject, prefix) {

.catch(function (/* error */) {
if (typeof newObject === 'object') {
newObject.id = id
newObject._id = id
} else {
newObject = idOrObject
}
Expand Down
12 changes: 7 additions & 5 deletions lib/helpers/start-listen-to-changes.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
module.exports = startListenToChanges

var toObject = require('../utils/to-object')

function startListenToChanges (state) {
state.db.changes({
since: 'now',
Expand All @@ -11,8 +9,12 @@ function startListenToChanges (state) {
.on('change', function (change) {
var doc = change.doc

var eventName = doc.deletedAt ? 'remove' : doc.updatedAt ? 'update' : 'add'
state.emitter.emit(eventName, toObject(doc))
state.emitter.emit('change', eventName, toObject(doc))
if (!doc.hoodie) {
doc.hoodie = {}
}

var eventName = doc.hoodie.deletedAt ? 'remove' : doc.hoodie.updatedAt ? 'update' : 'add'
state.emitter.emit(eventName, doc)
state.emitter.emit('change', eventName, doc)
})
}
49 changes: 28 additions & 21 deletions lib/helpers/update-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,62 @@ var extend = require('pouchdb-utils').extend
var PouchDBErrors = require('pouchdb-errors')

var changeObject = require('../utils/change-object')
var toDoc = require('../utils/to-doc')
var addTimestamps = require('../utils/add-timestamps')
var toId = require('../utils/to-id')

var findMany = require('./find-many')

module.exports = function updateMany (state, array, change, prefix) {
var objects
var ids = array.map(toId)
var docs
var ids = array.map(function (doc) {
var id = toId(doc)

if (prefix && id.substr(0, prefix.length) !== prefix) {
id = prefix + id
}

return id
})

return findMany(state, array, prefix)

.then(function (objects) {
.then(function (docs) {
if (change) {
return objects.map(function (object) {
if (object instanceof Error) {
return object
return docs.map(function (doc) {
if (doc instanceof Error) {
return doc
}
return changeObject(change, object)
return changeObject(change, doc)
})
}

return objects.map(function (object, index) {
var passedObject = array[index]
if (object instanceof Error) {
return object
return docs.map(function (doc, index) {
var passedDoc = array[index]
if (doc instanceof Error) {
return doc
}
if (typeof passedObject !== 'object') {
if (typeof passedDoc !== 'object') {
return PouchDBErrors.NOT_AN_OBJECT
}
return extend(object, passedObject)
return extend(doc, passedDoc, {_id: doc._id, _rev: doc._rev, hoodie: doc.hoodie})
})
})

.then(function (_objects) {
objects = _objects
var validObjects = objects.filter(function (object) {
return !(object instanceof Error)
.then(function (_docs) {
docs = _docs
var validObjects = docs.filter(function (doc) {
return !(doc instanceof Error)
})
validObjects.forEach(addTimestamps)
return state.db.bulkDocs(validObjects.map(toDoc))
return state.db.bulkDocs(validObjects)
})

.then(function (responses) {
responses.forEach(function (response) {
var index = ids.indexOf(response.id)
objects[index]._rev = response.rev
docs[index]._rev = response.rev
})

return objects
return docs
})
}
25 changes: 12 additions & 13 deletions lib/helpers/update-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,33 @@ var PouchDBErrors = require('pouchdb-errors')
var Promise = require('lie')

var changeObject = require('../utils/change-object')
var toDoc = require('../utils/to-doc')
var addTimestamps = require('../utils/add-timestamps')

var findOne = require('./find-one')

module.exports = function updateOne (state, idOrObject, change, prefix) {
var object
module.exports = function updateOne (state, idOrDoc, change, prefix) {
var doc

if (typeof idOrObject === 'string' && !change) {
if (typeof idOrDoc === 'string' && !change) {
return Promise.reject(PouchDBErrors.NOT_AN_OBJECT)
}

return findOne(state, idOrObject, prefix)
return findOne(state, idOrDoc, prefix)

.then(function (object) {
.then(function (doc) {
if (!change) {
return extend(object, idOrObject, {id: object.id, _rev: object._rev})
return extend(doc, idOrDoc, {_id: doc._id, _rev: doc._rev, hoodie: doc.hoodie})
}
return changeObject(change, object)
return changeObject(change, doc)
})

.then(function (_object) {
object = _object
return state.db.put(toDoc(addTimestamps(object)))
.then(function (_doc) {
doc = _doc
return state.db.put(addTimestamps(doc))
})

.then(function (response) {
object._rev = response.rev
return object
doc._rev = response.rev
return doc
})
}
2 changes: 1 addition & 1 deletion lib/helpers/update-or-add-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ module.exports = function updateOrAddMany (state, passedObjects, prefix) {
var objects = []

updatedObjects.concat(addedObjects).forEach(function (object) {
var index = passedObjectIds.indexOf(object.id)
var index = passedObjectIds.indexOf(object._id)
if (index !== -1) {
objects[index] = object
}
Expand Down
2 changes: 1 addition & 1 deletion lib/helpers/update-or-add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ module.exports = function updateOrAddOne (state, idOrObject, newObject, prefix)
}

if (newObject) {
newObject.id = toId(idOrObject)
newObject._id = toId(idOrObject)
return addOne(state, newObject, prefix)
}

Expand Down

0 comments on commit d462a7d

Please sign in to comment.