# Lifecycle hooks
Hooks are triggered by specific events throughout trilogy's lifecycle that
you can tap into in order to fire off your own actions. There are both pre- and
post-event hooks for object creation, updates, and removals, as well as an
onQuery
hook that's called on each SQL query.
TIP
It's important to be aware of the fact that methods such as increment
,
decrement
, and set
will not trigger update hooks because they only
modify a property and not a record as a whole. The hook would
therefore not be useful since you could not reliably identify records.
These hooks can all be attached to a Trilogy
instance or scoped more
specifically to a particular Model
. You could for example add a beforeUpdate
hook to a model that sets the updated_at
timestamp
whenever an object is updated:
import { connect } from 'trilogy'
const db = connect('./storage.db')
;(async () => {
const users = await db.model('users', {
name: String
}, {
timestamps: true
})
users.beforeUpdate(item => {
item.updated_at = new Date()
})
await users.create({ name: 'mr. robot' })
})()
# preventing events
In the case of the before*
hooks, it's also possible to cancel the upcoming
event from any subscriber to that hook. For example, in a beforeCreate
hook:
import { connect, EventCancellation } from 'trilogy'
const db = connect(':memory:')
db.model('users', {
name: String,
isAdmin: Boolean
}).then(users => {
const unsub = users.beforeCreate(user => {
if (user.isAdmin && user.name !== 'boss') {
// boss is the only admin allowed apparently
return EventCancellation
}
})
})