storeAllFromJson method

FutureOr<Map<String, List<Object>>> storeAllFromJson(
  1. Map<String, Iterable<Map<String, dynamic>>> entries, {
  2. Transaction? transaction,
  3. EntityResolutionRules? resolutionRules,
  4. Map<String, dynamic>? variables,
})

Implementation

FutureOr<Map<String, List<Object>>> storeAllFromJson(
  Map<String, Iterable<Map<String, dynamic>>> entries, {
  Transaction? transaction,
  EntityResolutionRules? resolutionRules,
  Map<String, dynamic>? variables,
}) async {
  var results = <String, List<Object>>{};

  var allRepositoriesBuildOrder = allRepositories().values.toList(
    growable: false,
  );

  var entriesRepositoriesOrdered = entries.entries
      .map((e) {
        var typeName = e.key;
        var entities = e.value;
        var entityRepository = getEntityRepository(name: typeName);
        return MapEntry(typeName, (entities, entityRepository));
      })
      .sorted((a, b) {
        var rep1 = a.value.$2;
        var rep2 = b.value.$2;

        var idx1 = rep1 != null
            ? allRepositoriesBuildOrder.indexOf(rep1)
            : -1;
        var idx2 = rep2 != null
            ? allRepositoriesBuildOrder.indexOf(rep2)
            : -1;

        if (idx1 < 0) {
          idx1 = 9999999;
        }

        if (idx2 < 0) {
          idx2 = 9999999;
        }

        return idx1.compareTo(idx2);
      })
      .toMapFromEntries();

  _log.info('Repositories build order:');
  for (var e in entriesRepositoriesOrdered.entries) {
    var typeName = e.key;
    _log.info('  -- $typeName');
  }

  for (var e in entriesRepositoriesOrdered.entries) {
    var typeName = e.key;
    var typeEntries = e.value.$1;
    var entityRepository = e.value.$2;

    if (typeEntries.isEmpty) {
      results[typeName] = [];
      continue;
    }

    _log.info(
      'Populating `$typeName`: ${typeEntries.length} JSON entries...$_logSectionOpen',
    );

    if (entityRepository == null) {
      throw StateError(
        "Can't find `EntityRepository` for type name: $typeName",
      );
    }

    try {
      var os = await entityRepository.storeAllFromJson(
        typeEntries,
        resolutionRules: resolutionRules,
      );
      results[typeName] = os;

      _log.info(
        'Populated `$typeName` entries: ${os.length}$_logSectionClose',
      );
    } catch (e, s) {
      _log.severe('Error population `$typeName` entries.', e, s);
      rethrow;
    }
  }

  return results;
}