normalizeEntityJSON method
- @protected
- Map<
String, dynamic> entityJson, { - String? entityName,
- String? table,
- 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;
}