Skip to content
This repository has been archived by the owner on Nov 10, 2023. It is now read-only.

Commit

Permalink
feat(hooks): add more events (#11)
Browse files Browse the repository at this point in the history
* feat(hooks): add more events

* docs(hooks): update docs
  • Loading branch information
gjuchault authored Mar 19, 2017
1 parent 8f68bd3 commit b500670
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 27 deletions.
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,18 +256,22 @@ Note: in the example above, the subscription is also closed

## Hooks

A few hooks are available in requelize: `preValidate`, `postValidate`, `preSave` and `postSave`
A few hooks are available in requelize: `validating`, `validated`, `saving`, `saved`, `creating`, `created`, `updating` and `updated`.

```js
User.on('preSave', (user) => {
User.on('saving', (user) => {
user.editedAt = new Date()
})

User.on('creating', (user) => {
user.createdAt = new Date()
})
```

Hooks also support promises

```js
User.on('preSave', (user) => {
User.on('saving', (user) => {
return somePromise()
.then(() => {
user.foo = 'bar'
Expand Down
48 changes: 37 additions & 11 deletions lib/model/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ function createModel (requelize) {
*/
static on (event, callback) {
debug(`adding hook ${Model._name}@${event}`)

if (!Model._events.hasOwnProperty(event)) {
Model._events[event] = []
}

Model._events[event].push(callback)
}

Expand Down Expand Up @@ -217,15 +222,22 @@ function createModel (requelize) {
*/
save () {
debug(`saving ${Model._name} -> ${JSON.stringify(this._data)}`)
let promise = takeEvents('preValidate', Model, this)
let promise = takeEvents('validating', Model, this)
let isSaved = Boolean((this[Model._options.primaryKey]))

if (this._validate) {
promise = validateSchema(Model, this)
.then(() => takeEvents('postValidate', Model, this))
.then(() => takeEvents('validated', Model, this))
}

return promise
.then(() => takeEvents('preSave', Model, this))
if (isSaved) {
promise = promise.then(() => takeEvents('updating', Model, this))
} else {
promise = promise.then(() => takeEvents('creating', Model, this))
}

promise = promise
.then(() => takeEvents('saving', Model, this))
.then(() => Model.insert(this._data, { conflict: 'update' }).run())
.then((res) => {
if (res.generated_keys) {
Expand All @@ -235,7 +247,14 @@ function createModel (requelize) {

return this
})
.then(() => takeEvents('postSave', Model, this))

if (isSaved) {
promise = promise.then(() => takeEvents('updated', Model, this))
} else {
promise = promise.then(() => takeEvents('created', Model, this))
}

return promise.then(() => takeEvents('saved', Model, this))
}

/**
Expand All @@ -244,14 +263,21 @@ function createModel (requelize) {
*/
delete () {
debug(`deleting key ${Model._name}:${Model._options.primaryKey}(${this[options.primaryKey]})`)
return Model
.get(this[options.primaryKey])
.delete()
.run()

if (!(this[Model._options.primaryKey])) {
return Promise.resolve(this)
}

return takeEvents('deleting', Model, this)
.then(() => Model
.get(this[Model._options.primaryKey])
.delete()
.run()
)
.then(() => {
this[options.primaryKey] = null

return this
return takeEvents('deleted', Model, this)
})
}

Expand Down Expand Up @@ -280,7 +306,7 @@ function createModel (requelize) {
Model._indexes = []
Model._virtuals = []
Model._joins = {}
Model._events = { preSave: [], postSave: [], preValidate: [], postValidate: [] }
Model._events = {}

bindRql(requelize, Model, Query)

Expand Down
4 changes: 2 additions & 2 deletions lib/model/util/takeEvents.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
* @return {Promise<inst>} Promise resolving the instance modified by each hook
*/
module.exports = function (event, Model, inst) {
let promise = Promise.resolve(inst)
let promise = Promise.resolve(inst);

Model._events[event].forEach((hook) => {
(Model._events[event] || []).forEach((hook) => {
promise = promise.then((res) => hook(res))
})

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "requelize",
"version": "0.3.2",
"version": "0.4.0",
"description": "RethinkDB ORM",
"main": "index.js",
"repository": "https://github.com/buckless/requelize.git",
Expand Down Expand Up @@ -29,6 +29,6 @@
"tape": "^4.6.3"
},
"peerDependencies": {
"joi": "10.x"
"joi": "^10.2.2"
}
}
30 changes: 30 additions & 0 deletions test/test.delete.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,33 @@ test('deletion', (t) => {
t.end()
})
})

test('deletion - inexistant document', (t) => {
t.plan(1)

let Foo
let foo

dropDb()
.then(() => {
Foo = requelize.model('foo', {
name: Joi.string()
})

return requelize.sync()
})
.then(() => {
foo = new Foo({ name: 'bar' })

return foo.delete()
})
.then(() => {
t.ok(!foo.id, 'deleted document')
})
.catch((err) => {
t.fail(err)
})
.then(() => {
t.end()
})
})
22 changes: 13 additions & 9 deletions test/test.hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ const Joi = require('joi')

const { test, requelize, dropDb } = require('./utils')

test('hooks - preSave', (t) => {
t.plan(2)
test('hooks - saving', (t) => {
t.plan(3)

let Foo
let inst
Expand All @@ -18,10 +18,14 @@ test('hooks - preSave', (t) => {
Foo.index('createdAt')
Foo.index('updatedAt')

Foo.on('preSave', (inst) => {
Foo.on('saving', (inst) => {
inst.updatedAt = new Date()
})

Foo.on('saving', () => {
t.pass('multiple events on the same model')
})

return requelize.sync()
})
.then(() => {
Expand All @@ -43,7 +47,7 @@ test('hooks - preSave', (t) => {
})
})

test('hooks - postSave', (t) => {
test('hooks - saved', (t) => {
t.plan(2)

let Foo
Expand All @@ -57,7 +61,7 @@ test('hooks - postSave', (t) => {

Foo.index('createdAt')

Foo.on('postSave', (inst) => {
Foo.on('saved', (inst) => {
inst.saved = true
})

Expand All @@ -82,7 +86,7 @@ test('hooks - postSave', (t) => {
})
})

test('hooks - preValidate', (t) => {
test('hooks - validating', (t) => {
t.plan(1)

let Foo
Expand All @@ -94,7 +98,7 @@ test('hooks - preValidate', (t) => {
foo: Joi.equal(true)
})

Foo.on('preValidate', (inst) => {
Foo.on('validating', (inst) => {
inst.foo = true
})

Expand All @@ -116,7 +120,7 @@ test('hooks - preValidate', (t) => {
})
})

test('hooks - postValidate', (t) => {
test('hooks - validated', (t) => {
t.plan(1)

let Foo
Expand All @@ -126,7 +130,7 @@ test('hooks - postValidate', (t) => {
.then(() => {
Foo = requelize.model('foo')

Foo.on('postValidate', (inst) => {
Foo.on('validated', (inst) => {
inst.foo = true
})

Expand Down

0 comments on commit b500670

Please sign in to comment.