getElements<T> method
Generic method used for retrieving items. It simplifies pagination flow, so services doesn't need to contain boilerplate code.
userId
is document id of the User
.
query
is the query used for the firestore.
logReference
is reference string for logging purposes so we know when this query gets executed
and what executes it.
onDocumentSnapshot
is a method with return type of an object.
lastDocumentSnapshot
must not be null if pagination is required as it is an indicator of where to
continue query.
Implementation
Future<List<T>?> getElements<T>({
required Query query,
required String logReference,
required T Function(DocumentSnapshot documentSnapshot) onDocumentSnapshot,
DocumentSnapshot? lastDocumentSnapshot,
}) async {
final bool isMoreQuery = lastDocumentSnapshot != null;
final Query currentQuery = isMoreQuery ? query.startAfterDocument(lastDocumentSnapshot) : query;
_loggingService.log('FirestoreGenericService.getElements.$logReference: More: $isMoreQuery');
try {
final QuerySnapshot querySnapshot = await currentQuery.get();
final List<T> elements = querySnapshot.docs.map((e) {
final T element = onDocumentSnapshot(e);
return element;
}).toList();
_loggingService.log('FirestoreGenericService.getElements.$logReference: Total: ${elements.length}');
return elements;
} catch (e) {
_loggingService.log(
'FirestoreTransactionsService.getElements: Exception: $e',
logType: LogType.error,
);
return null;
}
}