fetchModels<T> method
Future<PaginatedResult<T> >
fetchModels<T>({
- required Query<
Object?> query, - required T fromMap(),
- required String collectionName,
- int? limit,
- DocumentSnapshot<
Object?> ? lastDocumentSnapshot,
override
Implementation
@override
Future<PaginatedResult<T>> fetchModels<T>({
required Query query,
required T Function(Map<String, dynamic>) fromMap,
required String collectionName,
int? limit,
DocumentSnapshot? lastDocumentSnapshot,
}) async {
try {
Query finalQuery = query;
if (limit != null) {
finalQuery = finalQuery.limit(limit);
}
if (lastDocumentSnapshot != null) {
finalQuery = finalQuery.startAfterDocument(lastDocumentSnapshot);
}
final snapshot = await finalQuery.get();
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('fetchModels - document parsing', e, {
'docId': doc.id,
'collectionName': collectionName,
'errorCount': errorCount,
});
}
}
// Логируем общую статистику если были ошибки
if (errorCount > 0) {
_logError('fetchModels - 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('fetchModels', e, {'collectionName': collectionName});
throw FirebaseServiceException(
'Error fetching $collectionName',
'fetchModels',
e,
);
}
}