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.hasEntity) {
              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);
}