LLaraNode
Database Package

Observers

Observers allow you to listen to model lifecycle events.

Observers

Observers allow you to listen to model lifecycle events.

Creating Observers

Extend the Observer class:

import { Observer } from "@lara-node/db";
import { User } from "../Models/User";

@Observe(User)
class UserObserver extends Observer {
  async creating(user: User) {
    // Before creating
  }

  async created(user: User) {
    // After creating
    console.log(`User created: ${user.email}`);
  }

  async updating(user: User) {
    // Before updating
  }

  async updated(user: User) {
    // After updating
  }

  async deleting(user: User) {
    // Before deleting
  }

  async deleted(user: User) {
    // After deleting
  }

  async restoring(user: User) {
    // Before restoring (soft delete)
  }

  async restored(user: User) {
    // After restoring
  }

  async retrieved(user: User) {
    // After retrieving from database
  }
}

Available Events

EventWhen
creatingBefore a new model is saved
createdAfter a new model is saved
updatingBefore an existing model is updated
updatedAfter an existing model is updated
savingBefore a model is saved (create or update)
savedAfter a model is saved
deletingBefore a model is deleted
deletedAfter a model is deleted
restoringBefore a soft-deleted model is restored
restoredAfter a soft-deleted model is restored
retrievedAfter a model is retrieved from the database

Registering Observers

Using @Observe Decorator

import { Observe } from "@lara-node/db";

@Observe(User)
class UserObserver extends Observer {
  created(user: User) {
    // ...
  }
}

Manual Registration

User.observe(UserObserver);

Example: Hash Password

@Observe(User)
class UserObserver extends Observer {
  async creating(user: User) {
    if (user.password) {
      user.password = await hashPassword(user.password);
    }
  }

  async updating(user: User) {
    if (user.isDirty("password")) {
      user.password = await hashPassword(user.password);
    }
  }
}

Example: Send Welcome Email

@Observe(User)
class UserObserver extends Observer {
  async created(user: User) {
    await Mail.to(user.email).send(new WelcomeMailable(user));
  }
}

Example: Clear Cache

@Observe(User)
class UserObserver extends Observer {
  async updated(user: User) {
    await Cache.del(`user:${user.id}`);
  }

  async deleted(user: User) {
    await Cache.del(`user:${user.id}`);
  }
}

Next Steps