refreshData static method

Future<RefreshResult> refreshData(
  1. ReportTemplate template, {
  2. Map<String, dynamic>? parameters,
  3. List<ReportFilter>? filters,
  4. Duration? cacheDuration,
  5. bool forceRefresh = false,
  6. DataRefreshCallback? refreshCallback,
})

Refreshes data, using the cache

Implementation

static Future<RefreshResult> refreshData(
  ReportTemplate template, {
  Map<String, dynamic>? parameters,
  List<ReportFilter>? filters,
  Duration? cacheDuration,
  bool forceRefresh = false,
  DataRefreshCallback? refreshCallback,
}) async {
  final cacheKey = _generateCacheKey(template, parameters, filters);

  try {
    // Unless forced, try the cache first
    if (!forceRefresh) {
      final cachedData = await DataCacheService.getCachedData(cacheKey);
      if (cachedData != null && !cachedData.isExpired) {
        return RefreshResult(
          data: cachedData.data,
          source: DataSource.cache,
          timestamp: cachedData.timestamp,
          metadata: cachedData.metadata,
        );
      }
    }

    if (refreshCallback != null) {
      final startTime = DateTime.now();
      final data = await refreshCallback(template, parameters, filters);
      final endTime = DateTime.now();

      // Salva in cache
      await DataCacheService.cacheData(
        cacheKey,
        data,
        duration: cacheDuration,
        metadata: {
          'template': template.name,
          'parameters': parameters,
          'filters': filters?.map((f) => f.field).toList(),
          'refreshTime': endTime.millisecondsSinceEpoch,
          'duration': endTime.difference(startTime).inMilliseconds,
        },
      );

      return RefreshResult(
        data: data,
        source: DataSource.remote,
        timestamp: endTime,
        metadata: {
          'refreshDuration': endTime.difference(startTime).inMilliseconds,
          'cacheKey': cacheKey,
        },
      );
    } else {
      throw Exception('No refresh callback provided');
    }
  } catch (e) {
    // On error, use the cache even when expired
    if (!forceRefresh) {
      final cachedData = await DataCacheService.getCachedData(cacheKey);
      if (cachedData != null) {
        return RefreshResult(
          data: cachedData.data,
          source: DataSource.cache,
          timestamp: cachedData.timestamp,
          metadata: {
            ...cachedData.metadata,
            'warning':
                'Data from the expired cache, because the refresh failed',
            'error': e.toString(),
          },
        );
      }
    }

    throw Exception('Error while refreshing the data: $e');
  }
}