read method

Future<QueryResult> read(
  1. Query query,
  2. Firestore db
)
inherited

Tries to fetch payload from firestore

Implementation

Future<QueryResult> read(Query query, Firestore db) async {
  if (query.limit == 1 && null != query.payload['id']) {
    final id = query.payload['id'] ?? Uuid().v1();
    final ref = db.collection(query.entityName).doc(id);

    if (await ref.exists) {
      final snapshot = await ref.get();
      return QueryResult.success(query, payload: snapshot.map);
    }
  } else {
    final ref = db.collection(query.entityName);
    var dbQuery = QueryReference(ref.gateway, ref.path);

    if (query.limit != null && query.limit! > 0) {
      dbQuery = ref.limit(query.limit!);
    }

    for (final constraint in query.where) {
      dbQuery = _applyConstraint(constraint, dbQuery);
    }

    final result = await dbQuery.get();
    final json = <String, dynamic>{};

    if (result.isNotEmpty) {
      for (final snapshot in result) {
        json.putIfAbsent(snapshot.id, () => snapshot.map);
      }
    }

    return QueryResult.success(query, payload: json);
  }

  return QueryResult.failed(
    query,
    errorMsg: 'Could not read data from database',
  );
}