listenModels<T> method

  1. @override
Stream<PaginatedResult<T>> listenModels<T>({
  1. required Query<Object?> query,
  2. required T fromMap(
    1. Map<String, dynamic>
    ),
  3. required String collectionName,
  4. int? limit,
})
override

Implementation

@override
Stream<PaginatedResult<T>> listenModels<T>({
  required Query query,
  required T Function(Map<String, dynamic>) fromMap,
  required String collectionName,
  int? limit,
}) {
  try {
    Query finalQuery = query;
    if (limit != null) {
      finalQuery = finalQuery.limit(limit);
    }

    return finalQuery.snapshots().map((snapshot) {
      final items = <T>[];
      int errorCount = 0;

      for (final doc in snapshot.docs) {
        try {
          final item = fromMap(doc.data() as Map<String, dynamic>);
          items.add(item);
        } catch (e) {
          errorCount++;
          // Логируем ошибку, но продолжаем обработку
          _logError('listenModels - document parsing', e, {
            'docId': doc.id,
            'collectionName': collectionName,
            'errorCount': errorCount,
          });
        }
      }

      // Логируем общую статистику если были ошибки
      if (errorCount > 0) {
        _logError('listenModels - summary', 'Document parsing errors occurred', {
          'collectionName': collectionName,
          'totalDocs': snapshot.docs.length,
          'successfulDocs': items.length,
          'errorCount': errorCount,
        });
      }

      return PaginatedResult(
        items: items,
        lastDocument: snapshot.docs.isNotEmpty ? snapshot.docs.last : null,
      );
    });
  } catch (e) {
    _logError('listenModels', e, {'collectionName': collectionName});
    throw FirebaseServiceException(
      'Error listening to $collectionName',
      'listenModels',
      e,
    );
  }
}