execute method
TODO: each Action does all the execution in here use DataContext to eval properties. ScopeManager should be refactored so it contains the update data context (its DataContext might not have the latest data)
Implementation
@override
Future<void> execute(BuildContext context, ScopeManager scopeManager) async {
try {
final evaluatedProvider = scopeManager.dataContext.eval(provider);
if (evaluatedProvider == 'moengage') {
await _handleMoEngageOperations(
context,
scopeManager,
operation: scopeManager.dataContext.eval(operation),
value: scopeManager.dataContext.eval(value),
eventName: scopeManager.dataContext.eval(eventName),
parameters: scopeManager.dataContext.eval(parameters),
attributeKey: scopeManager.dataContext.eval(attributeKey),
);
if (onSuccess != null) {
await ScreenController().executeAction(context, onSuccess!);
}
} else if (evaluatedProvider == 'adobe') {
final result = await _handleAdobeOperations(
context,
scopeManager,
operation: scopeManager.dataContext.eval(operation),
eventName: scopeManager.dataContext.eval(eventName),
parameters: scopeManager.dataContext.eval(parameters),
attributeKey: scopeManager.dataContext.eval(attributeKey),
);
if (onSuccess != null) {
await ScreenController().executeAction(
context,
onSuccess!,
event: EnsembleEvent(null, data: result.toString()),
);
}
} else {
Map<String, dynamic> logData = {
'name': scopeManager.dataContext.eval(eventName),
'parameters': _convertToStringMap(scopeManager.dataContext.eval(parameters) ?? {}),
'logLevel': stringToLogLevel(scopeManager.dataContext.eval(logLevel)),
'provider': evaluatedProvider,
'operation': scopeManager.dataContext.eval(operation) ?? 'logEvent',
'userId': scopeManager.dataContext.eval(userId),
};
if (evaluatedProvider == 'firebase' && originalPayload != null) {
// Extract Firebase parameters from originalPayload and add to logData
for (FirebaseParams param in FirebaseParams.values) {
final key = param.name;
if (originalPayload!.containsKey(key)) {
final value = scopeManager.dataContext.eval(originalPayload![key]);
if (value != null) {
logData[key] = value;
}
}
}
}
LogManager().log(logging.LogType.appAnalytics, logData);
if (onSuccess != null) {
await ScreenController().executeAction(context, onSuccess!);
}
}
} catch (error) {
if (onError != null) {
await ScreenController().executeAction(
context,
onError!,
event: EnsembleEvent(null, error: error.toString()),
);
} else {
rethrow;
}
}
}