findCollectionWithConverter method

Query<T> findCollectionWithConverter()

Finds a CollectionReference of type T based on specified _collectionPath.

Make sure to have specified the _toJson and _fromJson methods or else the FirestoreApi will not now how to convert the data to T.

If _tryAddLocalId is true then your data will also contain a local id field based on the _idFieldName specified in the constructor. Add this id field to your T and you will have easy access to the document id at any time.

If _tryAddLocalDocumentReference is true then your data will also contain a local reference field based on the _documentReferenceFieldName specified in the constructor. Add this reference field to your T and you will have easy access to the document reference at any time.

If you rather want to retrieve data in the raw form of a List<Map<String, dynamic>> consider using the findCollection method instead.

Implementation

Query<T> findCollectionWithConverter() {
  _log.info(
    message: 'Finding collection with converter..',
    sensitiveData: _shouldNotSensitiveInfo
        ? null
        : SensitiveData(
            path: _collectionPath(),
          ),
  );
  return (_isCollectionGroup
          ? _firebaseFirestore.collectionGroup(_collectionPath())
          : _firebaseFirestore.collection(_collectionPath()))
      .withConverter<T>(
    fromFirestore: (snapshot, _) {
      final data = snapshot.data() ?? {};
      try {
        return _fromJson!(
          data
              .tryAddLocalId(
                snapshot.id,
                idFieldName: _idFieldName,
                tryAddLocalId: _tryAddLocalId,
              )
              .tryAddLocalDocumentReference(
                snapshot.reference,
                referenceFieldName: _documentReferenceFieldName,
                tryAddLocalDocumentReference: _tryAddLocalDocumentReference,
              ),
        );
      } catch (error, stackTrace) {
        _log.error(
          message:
              'Unexpected error caught while adding local id and document reference',
          sensitiveData: _shouldNotSensitiveError
              ? null
              : SensitiveData(
                  path: _collectionPath(),
                  id: snapshot.id,
                  data: data,
                ),
          stackTrace: stackTrace,
          error: InvalidJsonException(
            id: snapshot.id,
            path: snapshot.reference.path,
            api: runtimeType.toString(),
            data: data,
          ),
        );
        _log.info(message: 'Returning error response..', sensitiveData: null);
        try {
          return _fromJsonError!(
            data
                .tryAddLocalId(
                  snapshot.id,
                  idFieldName: _idFieldName,
                  tryAddLocalId: _tryAddLocalId,
                )
                .tryAddLocalDocumentReference(
                  snapshot.reference,
                  referenceFieldName: _documentReferenceFieldName,
                  tryAddLocalDocumentReference: _tryAddLocalDocumentReference,
                ),
          );
        } catch (error, stackTrace) {
          _log.error(
            message:
                'Unexpected error caught while adding local id and document reference',
            sensitiveData: _shouldNotSensitiveError
                ? null
                : SensitiveData(
                    path: _collectionPath(),
                    id: snapshot.id,
                    data: data,
                  ),
            error: error,
            stackTrace: stackTrace,
          );
        }
        rethrow;
      }
    },
    toFirestore: (data, _) {
      try {
        return _toJson!(data)
            .tryRemoveLocalId(
              idFieldName: _idFieldName,
              tryRemoveLocalId: _tryAddLocalId,
            )
            .tryRemoveLocalDocumentReference(
              referenceFieldName: _documentReferenceFieldName,
              tryRemoveLocalDocumentReference: _tryAddLocalDocumentReference,
            );
      } catch (error) {
        _log.error(
          message:
              'Unexpected error caught while removing local id and document reference',
          sensitiveData: _shouldNotSensitiveError
              ? null
              : SensitiveData(
                  path: _collectionPath(),
                  data: data,
                ),
        );
        rethrow;
      }
    },
  );
}