fireModelEvent method

Future<bool> fireModelEvent(
  1. ModelLifecycle event, {
  2. bool halt = true,
})

Fire a model lifecycle event.

Implementation

Future<bool> fireModelEvent(ModelLifecycle event, {bool halt = true}) async {
  // 1. Call Observers
  final observers = ObserverRegistry().getObserversByType(runtimeType);
  for (final observer in observers) {
    bool? result;
    switch (event) {
      case ModelLifecycle.creating:
        result = observer.creating(this as dynamic);
        break;
      case ModelLifecycle.created:
        observer.created(this as dynamic);
        break;
      case ModelLifecycle.updating:
        result = observer.updating(this as dynamic);
        break;
      case ModelLifecycle.updated:
        observer.updated(this as dynamic);
        break;
      case ModelLifecycle.saving:
        result = observer.saving(this as dynamic);
        break;
      case ModelLifecycle.saved:
        observer.saved(this as dynamic);
        break;
      case ModelLifecycle.deleting:
        result = observer.deleting(this as dynamic);
        break;
      case ModelLifecycle.deleted:
        observer.deleted(this as dynamic);
        break;
      case ModelLifecycle.restoring:
        result = observer.restoring(this as dynamic);
        break;
      case ModelLifecycle.restored:
        observer.restored(this as dynamic);
        break;
      case ModelLifecycle.forceDeleting:
        result = observer.forceDeleting(this as dynamic);
        break;
      case ModelLifecycle.forceDeleted:
        observer.forceDeleted(this as dynamic);
        break;
      case ModelLifecycle.retrieved:
        observer.retrieved(this as dynamic);
        break;
    }

    if (halt && result == false) return false;
  }

  // 2. Dispatch System Events
  Event? systemEvent;
  switch (event) {
    case ModelLifecycle.creating:
      systemEvent = ModelCreating(this as dynamic);
      break;
    case ModelLifecycle.created:
      systemEvent = ModelCreated(this as dynamic);
      break;
    case ModelLifecycle.updating:
      systemEvent = ModelUpdating(this as dynamic);
      break;
    case ModelLifecycle.updated:
      systemEvent = ModelUpdated(this as dynamic);
      break;
    case ModelLifecycle.deleting:
      systemEvent = ModelDeleting(this as dynamic);
      break;
    case ModelLifecycle.deleted:
      systemEvent = ModelDeleted(this as dynamic);
      break;
    case ModelLifecycle.restoring:
      systemEvent = ModelRestoring(this as dynamic);
      break;
    case ModelLifecycle.restored:
      systemEvent = ModelRestored(this as dynamic);
      break;
    case ModelLifecycle.forceDeleting:
      systemEvent = ModelForceDeleting(this as dynamic);
      break;
    case ModelLifecycle.forceDeleted:
      systemEvent = ModelForceDeleted(this as dynamic);
      break;
    case ModelLifecycle.retrieved:
      systemEvent = ModelRetrieved(this as dynamic);
      break;
    default:
      break;
  }

  if (systemEvent != null) {
    await Khadem.events.dispatch(systemEvent);
    if (halt &&
        systemEvent is StoppableEvent &&
        systemEvent.isPropagationStopped) {
      return false;
    }
  }

  // 3. Dispatch Custom Events
  await _dispatchCustomEvent(event);

  return true;
}