convertTo method

  1. @override
DynamicMap? convertTo(
  1. String key,
  2. Object? value,
  3. DynamicMap original, [
  4. FirestoreModelAdapterBase? adapter,
])
override

Convert from ModelFieldValue to a type that can be managed by Firestore.

Generate and return a DynamicMap value from key and value. original is passed the DynamicMap before conversion.

Return Null if there are no changes.

FirestoreModelAdapterBase is passed to adapter.

ModelFieldValueからFirestoreで管理可能な型に変換します。

keyvalueからDynamicMapの値を生成して返してください。originalは変換前のDynamicMapを渡します。

変更がない場合はNullを返してください。

adapterFirestoreModelAdapterBaseが渡されます。

Implementation

@override
DynamicMap? convertTo(
  String key,
  Object? value,
  DynamicMap original, [
  FirestoreModelAdapterBase? adapter,
]) {
  if (value is DynamicMap && value.containsKey(_kTypeKey)) {
    final type = value.get(_kTypeKey, "");
    if (type == this.type) {
      final fromUser = value.get(ModelCounter.kSourceKey, "") ==
          ModelFieldValueSource.user.name;
      final count = value.get<num>(ModelCounter.kValueKey, 0.0);
      final increment = value.get<num>(ModelCounter.kIncrementKey, 0.0);
      final targetKey = "#$key";
      return {
        targetKey: {
          kTypeFieldKey: this.type,
          ModelCounter.kValueKey: count,
          ModelCounter.kIncrementKey: increment,
          _kTargetKey: key,
        },
        key: fromUser ? count : FieldValue.increment(increment),
      };
    }
  } else if (value is List) {
    final list = value.whereType<DynamicMap>();
    if (list.isNotEmpty && list.every((e) => e.get(_kTypeKey, "") == type)) {
      final target = <DynamicMap>[];
      final res = <Object>[];
      final targetKey = "#$key";
      for (final entry in list) {
        final fromUser = entry.get(ModelCounter.kSourceKey, "") ==
            ModelFieldValueSource.user.name;
        final count = entry.get<num>(ModelCounter.kValueKey, 0.0);
        final increment = entry.get<num>(ModelCounter.kIncrementKey, 0.0);
        target.add({
          kTypeFieldKey: type,
          ModelCounter.kValueKey: count,
          ModelCounter.kIncrementKey: increment,
          _kTargetKey: key,
        });
        res.add(fromUser ? count : FieldValue.increment(increment));
      }
      return {
        targetKey: target,
        key: res,
      };
    }
  } else if (value is Map) {
    final map = value
        .where((key, value) => value is DynamicMap)
        .cast<String, DynamicMap>();
    if (map.isNotEmpty &&
        map.values.every((e) => e.get(_kTypeKey, "") == type)) {
      final target = <String, DynamicMap>{};
      final res = <String, Object>{};
      final targetKey = "#$key";
      for (final entry in map.entries) {
        final fromUser = entry.value.get(ModelCounter.kSourceKey, "") ==
            ModelFieldValueSource.user.name;
        final count = entry.value.get<num>(ModelCounter.kValueKey, 0.0);
        final increment =
            entry.value.get<num>(ModelCounter.kIncrementKey, 0.0);
        target[entry.key] = {
          kTypeFieldKey: type,
          ModelCounter.kValueKey: count,
          ModelCounter.kIncrementKey: increment,
          _kTargetKey: key,
        };
        res[entry.key] = fromUser ? count : FieldValue.increment(increment);
      }
      return {
        targetKey: target,
        key: res,
      };
    }
  }
  return null;
}