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;
}
}