serializedPropsToEntity<Model> function

Entity<dynamic, Object> serializedPropsToEntity<Model>(
  1. Map<String, dynamic> json, {
  2. List<EntityTypeConverter> converters = const [],
})

Implementation

Entity serializedPropsToEntity<Model>(
  final Map<String, dynamic> json, {
  List<EntityTypeConverter> converters = const [],
}) {
  final mirror = reflectEntity<Model>();
  final entityMeta = getEntityMetaData(Model);
  final entityProperties = getEntityProperties(Model);
  final constructorMethod = mirror.declarations.entries
      .firstWhereOrNull((e) => e.key == '$Model')
      ?.value as MethodMirror;
  final constructorParams = constructorMethod.parameters;

  final mappedConverters =
      _combineConverters(entityMeta.converters ?? [], converters);

  /// conversion to Database compatible types using [EntityTypeConverter]
  final transformedRecordMap = <String, dynamic>{};
  for (final entry in entityProperties.entries) {
    final value = json[entry.value.dbColumnName];
    final typeConverter = mappedConverters[entry.value.type];
    transformedRecordMap[entry.value.dartName] =
        typeConverter == null ? value : typeConverter.fromDbType(value);
  }

  final namedDeps = constructorParams
      .where((e) => e.isNamed)
      .map((e) =>
          (name: e.simpleName, value: transformedRecordMap[e.simpleName]))
      .fold<Map<Symbol, dynamic>>(
          {}, (prev, e) => prev..[Symbol(e.name)] = e.value);

  final dependencies = constructorParams
      .where((e) => !e.isNamed)
      .map((e) => transformedRecordMap[e.simpleName])
      .toList();

  final newEntityInstance = mirror.newInstance('', dependencies, namedDeps);
  return (newEntityInstance as Entity)
    ..id = json[entityMeta.primaryKey]
    ..createdAt = transformedRecordMap[entityMeta.createdAtColumn]
    ..updatedAt = transformedRecordMap[entityMeta.updatedAtColumn]
    .._isLoadedFromDB = true;
}