toJsonEncodable method

ToEncodableJson? toJsonEncodable(
  1. APIRequest apiRequest,
  2. ToEncodableJsonProvider encodableJsonProvider,
  3. Object o
)

Implementation

ToEncodableJson? toJsonEncodable(APIRequest apiRequest,
    ToEncodableJsonProvider encodableJsonProvider, Object o) {
  if (o is EntityReferenceList ||
      o is DateTime ||
      o is Time ||
      o is Decimal ||
      o is DynamicNumber) {
    return null;
  }

  var t = o is EntityReference ? o.type : o.runtimeType;

  // No rule for entity type. No `ToEncodableJson` filter: return null
  if (!hasRuleForEntityType(t)) return null;

  var allowType = isAllowedEntityType(t);

  // Block not allowed type. Return `ToEncodableJson` filter: empty `Map`
  if (allowType != null && !allowType) {
    return (o, j) => <String, Object>{};
  }

  // No rule for entity field. No `ToEncodableJson` filter: return null
  if (!hasRuleForEntityTypeField(t)) {
    return null;
  }

  return (o, j) {
    if (o == null) return null;

    var enc = encodableJsonProvider(o);

    Object? map;
    if (enc == null) {
      var classReflection =
          ReflectionFactory().getRegisterClassReflection(o.runtimeType);

      if (classReflection != null) {
        map = classReflection.toMapFromFields(o);
      } else {
        map = j.toJson(o, autoResetEntityCache: false);
      }
    } else {
      map = enc(o, j);
    }

    if (map is! Map) return map;

    var t = o.runtimeType;

    var c = EntityAccessRulesContext(this, o, context: apiRequest);

    map.removeWhere((key, _) {
      var allowed = isAllowedEntityTypeField(t, key, context: c);
      return allowed != null && !allowed;
    });

    return map;
  };
}