normalizeEntityJSON method

  1. @protected
Map<String, dynamic> normalizeEntityJSON(
  1. Map<String, dynamic> entityJson, {
  2. String? entityName,
  3. String? table,
  4. EntityRepository<Object>? entityRepository,
})
inherited

Normalizes an entity JSON to be stored: the references to other entities (single, EntityReference, lists and EntityReferenceList) become their IDs, and a bytes field becomes a DataURLBase64 string (if encodeBytesAsDataURL).

Implementation

@protected
Map<String, dynamic> normalizeEntityJSON(
  Map<String, dynamic> entityJson, {
  String? entityName,
  String? table,
  EntityRepository? entityRepository,
}) {
  entityRepository ??= getEntityRepository(
    name: entityName,
    tableName: table,
  );

  if (entityRepository == null) {
    throw StateError(
      "Can't determine `EntityRepository` for: entityName=$entityName ; tableName=$table",
    );
  }

  var entityHandler = entityRepository.entityHandler;

  var encodeBytesAsDataURL = this.encodeBytesAsDataURL;

  var entityJsonNormalized = entityJson.map((key, value) {
    if (value == null || (value as Object).isPrimitiveValue) {
      return MapEntry(key, value);
    } else if (encodeBytesAsDataURL && value is Uint8List) {
      var dataURLBase64 = DataURLBase64.from(value);
      return MapEntry(key, dataURLBase64.toString());
    }

    var fieldType = entityHandler.getFieldType(
      null,
      key,
      resolveFiledName: false,
    );

    if (fieldType != null) {
      if (fieldType.isEntityReferenceType) {
        var entityType = fieldType.arguments0!.type;
        var fieldEntityRepository = getEntityRepositoryByType(entityType);

        if (fieldEntityRepository == null) {
          throw StateError(
            "Can't determine `EntityRepository` for field `$key`: fieldType=$fieldType",
          );
        }

        if (value is EntityReference) {
          if (value.isNull) {
            value = null;
          } else if (value.isIdSet) {
            value = value.id;
          } else if (value.isEntitySet) {
            value = fieldEntityRepository.getEntityID(value.entity);
          } else {
            throw StateError("Invalid state: $value");
          }
        } else if (!value.isPrimitiveValue) {
          value = fieldEntityRepository.getEntityID(value);
        }
      } else if (fieldType.isEntityReferenceListType) {
        var listEntityType = fieldType.arguments0!;

        var fieldListEntityRepository = getEntityRepositoryByTypeInfo(
          listEntityType,
        );
        if (fieldListEntityRepository == null) {
          throw StateError(
            "Can't determine `EntityRepository` for field `$key` List type: fieldType=$fieldType",
          );
        }

        if (value is EntityReferenceList) {
          // Its IDs (from its entities, if only those are set):
          value = value.isNull ? null : value.ids;
        } else {
          var valIter = value is Iterable ? value : [value];

          value = valIter
              .map(
                (v) => fieldListEntityRepository.isOfEntityType(v)
                    ? fieldListEntityRepository.getEntityID(v)
                    : v,
              )
              .toList();
        }
      } else if (fieldType.isListEntity) {
        var listEntityType = fieldType.listEntityType!;

        var fieldListEntityRepository = getEntityRepositoryByTypeInfo(
          listEntityType,
        );
        if (fieldListEntityRepository == null) {
          throw StateError(
            "Can't determine `EntityRepository` for field `$key` List type: fieldType=$fieldType",
          );
        }

        var valIter = value is Iterable ? value : [value];

        value = valIter
            .map(
              (v) => fieldListEntityRepository.isOfEntityType(v)
                  ? fieldListEntityRepository.getEntityID(v)
                  : v,
            )
            .toList();
      } else if (!fieldType.isPrimitiveType && fieldType.entityType != null) {
        var entityType = fieldType.entityType!;
        var fieldEntityRepository = getEntityRepositoryByType(entityType);

        if (fieldEntityRepository == null) {
          throw StateError(
            "Can't determine `EntityRepository` for field `$key`: fieldType=$fieldType",
          );
        }

        value = fieldEntityRepository.getEntityID(value);
      }
    }

    return MapEntry(key, value);
  });

  return entityJsonNormalized;
}