ensureReferencesStored method
FutureOr<bool>
ensureReferencesStored(
- O o, {
- Transaction? transaction,
- TransactionOperation? operation,
override
Implementation
@override
FutureOr<bool> ensureReferencesStored(O o,
{Transaction? transaction, TransactionOperation? operation}) {
checkNotClosed();
transaction ??= Transaction.executingOrNew(autoCommit: true);
var nonPrimitiveFields = _getNonPrimitiveFields(o);
var futures = nonPrimitiveFields.entries
.map((entry) {
final fieldName = entry.key;
final fieldType = entry.value;
var fieldValue = entityHandler.getField(o, fieldName) as Object?;
if (fieldValue == null) return null;
Object? value = fieldValue;
if (value is EntityReferenceList) {
if (value.isNull) {
return null;
} else {
value = value.entitiesOrIDs;
}
}
if (value is List &&
((fieldType.isList && fieldType.hasArguments) ||
fieldType.isEntityReferenceListType)) {
var elementType = fieldType.arguments.first;
if (!EntityHandler.isValidEntityType(elementType.type)) return null;
var elementRepository =
provider.getEntityRepositoryByTypeInfo(elementType);
if (elementRepository == null) return null;
var futures = value.map((e) {
if (!elementRepository.isOfEntityType(e)) return e;
return elementRepository.ensureStored(e,
transaction: transaction, operation: operation);
}).toList();
return futures.resolveAll().resolveMapped((ids) {
if (fieldValue is EntityReferenceList) {
fieldValue.updateIDsFromEntities();
}
return ids;
});
} else {
var entityType = fieldType.entityType;
if (entityType == null) return null;
var entity = value;
if (value is EntityReference) {
if (value.isNull) {
return null;
} else if (value.isEntitySet) {
entity = value.entity;
} else {
return value.id;
}
}
var repository =
provider.getEntityRepository(type: entityType, obj: entity);
if (repository == null) return null;
var stored = repository.ensureStored(entity as dynamic,
transaction: transaction, operation: operation);
return stored;
}
})
.whereNotNullSync()
.toList(growable: false);
return futures.resolveAllWithValue(true);
}