watch<T> method

  1. @override
Stream<T> watch<T>(
  1. Endpoint endpoint, {
  2. Map<String, dynamic>? queryParams,
  3. Map<String, String>? pathParams,
})
override

Watches an endpoint for changes (Streams).

Implementation

@override
Stream<T> watch<T>(
  Endpoint endpoint, {
  Map<String, dynamic>? queryParams,
  Map<String, String>? pathParams,
}) {
  final path = endpoint.buildPath(pathParams);

  if (endpoint.requiresAuth && _auth.currentUser == null) {
    throw Exception('Authentication required for watching: ${endpoint.id}');
  }

  final pathSegments = path.split('/').where((s) => s.isNotEmpty).toList();

  if (pathSegments.length % 2 == 0) {
    // Watch Document
    return _firestore.doc(path).snapshots().map((snapshot) {
      final data = snapshot.data();
      if (data == null) throw Exception('Document not found at $path');
      final enrichedData = _attachMetadata(data, snapshot.id);
      return endpoint.parser != null
          ? endpoint.parser!(enrichedData) as T
          : enrichedData as T;
    });
  } else {
    // Watch Collection
    final query = _applyQueries(_firestore.collection(path), queryParams);
    return query.snapshots().map((snapshot) {
      final list = snapshot.docs
          .map((d) => _attachMetadata(d.data() as Map<String, dynamic>, d.id))
          .toList();
      return endpoint.parser != null
          ? endpoint.parser!(list) as T
          : list as T;
    });
  }
}