Hooks

Forest Admin allows customizing at a very low level the behavior of any given collection via the usage of Collection Hooks.

Collection Hooks are a very powerful feature and require special care when using them.

How it works

As visible here, any given collection should implement all of the following functions:

  • list

  • create

  • update

  • delete

  • aggregate

The Collection Hooks feature allows executing code before and/or after any of these functions, providing an easy way to interact with your collections.

To declare a hook on a collection, the following information is required:

  • A hook position (Before | After)

  • A hook type (List | Create | Update | Delete | Aggregate)

  • A callback, that will receive a context matching the provided hook position and hook definition.

Basic use-cases

In the following example, we want to prevent a set of users from updating any records of the Transactions table. We want to check if the user email is allowed to update a record via an external API call.

transaction.addHook('Before', 'Update', async context => {
  // context.caller contains informations about the current user, the defined timezone, etc.
  // In this case, context.caller.email is the email used in Forest Admin by the user that initiated the call
  const isAllowed = await myFunctionToCheckIfUserIsAllowed(context.caller.email);
  if (!isAllowed) {
    // Raising an error here will prevent the execution of the update function,
    // as well as any other hooks that may be defined afterwards.
    context.throwForbiddenError(`${context.caller.email} is not allowed!`);
  }
});

Another good example would be the following: Each time a new User is created in the database, I want to send him an email.

user.addHook('After', 'Create', async (context, responseBuilder) => {
  // The result of the create function always return an array of records
  const userEmail = context.records[0]?.email;
  await MyEmailSender.sendEmail({
    from: 'erlich@bachman.com',
    to: userEmail,
    message: 'Hey, a new account was created with this email.',
  });
});

Last updated

Was this helpful?

Revision created

docs(datasource-sql): document introspection process