fetch method

Future<List<T>> fetch(
  1. DatumQuery query, {
  2. DataFetchStrategy strategy = DataFetchStrategy.localFirst,
  3. String? userId,
  4. bool persistRemoteResults = false,
})

Runs query using a DataFetchStrategy, removing the repetitive "try local, then fall back to remote" boilerplate (#17).

Implementation

Future<List<T>> fetch(
  DatumQuery query, {
  DataFetchStrategy strategy = DataFetchStrategy.localFirst,
  String? userId,
  bool persistRemoteResults = false,
}) async {
  _ensureInitialized();
  switch (strategy) {
    case DataFetchStrategy.localOnly:
      return this.query(query, source: DataSource.local, userId: userId);
    case DataFetchStrategy.remoteOnly:
      return this.query(query, source: DataSource.remote, userId: userId);
    case DataFetchStrategy.localFirst:
      final local = await this.query(query, source: DataSource.local, userId: userId);
      if (local.isNotEmpty) return local;
      final remote = await this.query(query, source: DataSource.remote, userId: userId);
      if (persistRemoteResults && remote.isNotEmpty) {
        await _persistFetchedLocally(remote);
      }
      return remote;
    case DataFetchStrategy.remoteFirst:
      try {
        final remote = await this.query(query, source: DataSource.remote, userId: userId);
        if (persistRemoteResults && remote.isNotEmpty) {
          await _persistFetchedLocally(remote);
        }
        return remote;
      } catch (e) {
        _logger.warn('remoteFirst fetch failed, falling back to local: $e');
        return this.query(query, source: DataSource.local, userId: userId);
      }
  }
}