reduceAllResponses function

Future<Map<String, dynamic>> reduceAllResponses(
  1. String funcType,
  2. List responses,
  3. dynamic data
)

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;
}