reduceAllResponses function
Implementation
Future<Map<String, dynamic>> reduceAllResponses(
String funcType,
List<dynamic> responses,
dynamic data,
) async {
bool listTypeFieldValues = isAListingCallable(funcType);
if (gceComDebug) {
logDebug(
'CRUD_commons | reduceAllResponses | funcType: $funcType, listTypeFieldValues: $listTypeFieldValues',
);
}
Map<String, dynamic> defaultValues = genericFuncArrayDefaultValue(data);
Map<String, dynamic> responsesReduced = defaultValues;
try {
for (Map<String, dynamic> response in responses) {
response = {...defaultValues, ...response};
responsesReduced['error'] +=
(responsesReduced['error'] != '' && response['error'] != ''
? ', '
: '') +
response['error'];
responsesReduced['fieldMsg'] = Map<String, dynamic>.from({
...responsesReduced['fieldMsg'],
...response['fieldMsg'],
});
// Merge fieldValues while preserving array values,
// to prevent data losing when following fieldValues has same key but empty.
// E.g. fieldValues["resultset"] may contains 'client_id' and 'client_secret' or another fields...
// and following response may contains fieldValues["resultset"] = {}
if (listTypeFieldValues) {
// Get the last response fieldValues. because list cannot be merged.
responsesReduced['fieldValues'] = response['fieldValues'];
} else {
Map<String, dynamic> mergedFieldValues = Map<String, dynamic>.from(
responsesReduced['fieldValues'],
);
if (gceComDebug) {
logDebug(
'CRUD_commons | reduceAllResponses | funcType: $funcType | MAP Merge of fieldValues'
'\nresponse:\n$response'
'\nmergedFieldValues:\n$mergedFieldValues',
);
}
for (MapEntry<String, dynamic> entry in Map<String, dynamic>.from(
response['fieldValues'],
).entries) {
String key = entry.key;
dynamic value = entry.value;
if (mergedFieldValues[key] is Map &&
value is Map &&
value.isNotEmpty) {
if (!mergedFieldValues.containsKey(key) ||
mergedFieldValues[key] == null) {
mergedFieldValues[key] = {};
}
for (var entry2 in value.entries) {
String key2 = entry2.key;
dynamic value2 = entry2.value;
mergedFieldValues[key][key2] = value2;
}
continue;
}
mergedFieldValues[key] = value;
}
responsesReduced['fieldValues'] = mergedFieldValues;
}
responsesReduced['fieldsToDelete'] = [
...responsesReduced['fieldsToDelete'],
...response['fieldsToDelete'],
];
responsesReduced['otherData'] = Map<String, dynamic>.from({
...responsesReduced['otherData'],
...response['otherData'],
});
}
} catch (e, stackTrace) {
responsesReduced['error'] = e.toString();
responsesReduced['error_code'] = 'FGCE-RAR-010';
await logError(
'CRUD_commons | reduceAllResponses | funcType: $funcType | ERROR: $e'
'\nError Trace:\n${stackTrace.toString()}',
responsesReduced['error_code'],
);
}
return responsesReduced;
}