listenModels<T> method
Stream<PaginatedResult<T> >
listenModels<T>({})
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,
);
}
}