ensureReferencesStored method

  1. @override
FutureOr<bool> ensureReferencesStored(
  1. O o, {
  2. Transaction? transaction,
  3. 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);
}