LogEvent.from constructor

LogEvent.from({
  1. Invokable? initiator,
  2. Map? payload,
})

Implementation

factory LogEvent.from({Invokable? initiator, Map? payload}) {
  payload = Utils.convertYamlToDart(payload);
  String? eventName = payload?['name'];
  String? operation = payload?['operation'];
  String? provider = payload?['provider'] ?? 'firebase';
  dynamic value = payload?['value'];
  String? attributeKey = payload?['attributeKey'];

  // Firebase validation
  if (provider == 'firebase') {
    Map<String, dynamic> validationPayload = {};
    if (payload != null) {
      payload.forEach((key, value) {
        if (key != null) {
          validationPayload[key.toString()] = value;
        }
      });
    }

    // Required Parameters validator for ALL Firebase operations
    try {
      FirebaseAnalyticsValidator.validate(operation ?? 'logEvent', validationPayload);
    } catch (e) {
      throw LanguageError(
          "${ensembleAction.ActionType.logEvent.name} validation failed: ${e.toString()}");
    }
  }
  // MoEngage validations
  else if (provider == 'moengage') {
    if (operation == null) {
      throw LanguageError('MoEngage requires operation type');
    }

    // Value validation for operations requiring it
    if (value == null &&
        !NoValueOperations.values.any((e) => e.name == operation)) {
      throw LanguageError('Operation $operation requires a value');
    }

    // Operation-specific validations
    switch (operation) {
      case 'trackEvent':
        if (eventName == null) {
          throw LanguageError('trackEvent requires event name');
        }
        break;

      case 'setLocation':
      case 'setUserAttributeLocation':
        final location = EnsembleGeoLocation.parse(value);
        if (location == null) {
          throw LanguageError('Invalid location format');
        }
        break;

      case 'custom':
      case 'timestamp':
        if (attributeKey == null) {
          throw LanguageError('Operation $operation requires attributeKey');
        }
        break;

      case 'locationAttribute':
        if (attributeKey == null) {
          throw LanguageError('Operation $operation requires attributeKey');
        }
        final location = EnsembleGeoLocation.parse(value);
        if (location == null) {
          throw LanguageError('Invalid location format');
        }
        break;

      case 'setContext':
        if (value != null && value is! List) {
          throw LanguageError('setContext requires List value');
        }
        break;
    }
  } else if (provider == 'adobe') {
    if (operation == 'trackAction') {
      if (eventName == null) {
        throw LanguageError('trackAction requires event name');
      }
    } else if (operation == 'trackState') {
      if (eventName == null) {
        throw LanguageError('trackState requires event name');
      }
    } else if (operation == 'sendEvent') {
      if (eventName == null) {
        throw LanguageError('sendEvent requires event name');
      }
    }
  }

  return LogEvent(
    initiator: initiator,
    eventName: eventName,
    parameters: payload?['parameters'] is Map ? payload!['parameters'] : null,
    logLevel: payload?['logLevel'] ?? logging.LogLevel.info.name,
    provider: provider,
    operation: operation,
    userId: payload?['userId'],
    value: value,
    attributeKey: attributeKey,
    originalPayload: payload,
    onSuccess: ensembleAction.EnsembleAction.from(payload?['onSuccess']),
    onError: ensembleAction.EnsembleAction.from(payload?['onError']),
  );
}