getElements<T> method

Future<List<T>?> getElements<T>({
  1. required Query<Object?> query,
  2. required String logReference,
  3. required T onDocumentSnapshot(
    1. DocumentSnapshot<Object?> documentSnapshot
    ),
  4. DocumentSnapshot<Object?>? lastDocumentSnapshot,
})

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