execute static method

Future<EventRuleResult> execute({
  1. required Event event,
  2. required String program,
  3. EventDataValue? changedEventDataValue,
})

Implementation

static Future<EventRuleResult> execute(
    {required Event event,
    required String program,
    EventDataValue? changedEventDataValue}) async {
  List<ProgramRule> programRules = await ProgramRuleQuery()
      .withActions()
      .where(attribute: 'program', value: program)
      .get();

  List<ProgramRuleVariable> programRuleVariables =
      await ProgramRuleVariableQuery()
          .where(attribute: 'program', value: program)
          .get();

  List<EventDataValue> eventDataValues = await EventDataValueQuery()
      .where(attribute: 'event', value: event.id)
      .get();

  final dataValueEntities =
      DataValueEntities.fromEventDataValues(eventDataValues);

  List<ProgramRuleAction> programRuleActions = ProgramRuleEngine.execute(
      dataValueEntities: dataValueEntities,
      programRules: programRules,
      programRuleVariables: programRuleVariables);

  final queue = Queue(parallel: 50);
  num availableItemCount = 0;

  programRuleActions.forEach((programRuleAction) {
    if (programRuleAction.programRuleActionType == 'ASSIGN') {
      availableItemCount++;
      queue.add(() => EventDataValueQuery()
          .setData(EventDataValue(
              dirty: true,
              dataElement: programRuleAction.dataElement as String,
              event: event.id,
              value: programRuleAction.data as String))
          .save());
    }
  });

  if (availableItemCount == 0) {
    queue.cancel();
  } else {
    await queue.onComplete;
  }

  Event updatedEvent =
      await EventQuery().withDataValues().byId(event.id as String).getOne();

  return EventRuleResult(
      event: updatedEvent, programRuleActions: programRuleActions);
}