Skip to content

Commit 584bad7

Browse files
committed
fix!: compatibility with the latest dogs_core changes
1 parent 3d1f25a commit 584bad7

File tree

4 files changed

+103
-69
lines changed

4 files changed

+103
-69
lines changed

packages/dogs_firestore/lib/src/engine.dart

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,52 +20,35 @@ import 'package:cloud_firestore/cloud_firestore.dart';
2020
import 'package:dogs_core/dogs_core.dart';
2121
import 'package:dogs_firestore/dogs_firestore.dart';
2222

23-
import 'codec.dart';
24-
import 'converters.dart';
25-
26-
DogEngine createFirebaseDogsEngine(DogEngine parent) {
27-
var engine = parent.fork(codec: FirebaseNativeCodec());
28-
engine.registerAutomatic(DateTimeToTimestampConverter());
29-
engine.registerAutomatic(Uint8ListToBlobConverter());
30-
engine.registerModeFactory(FirestoreDocumentOpmodeFactory());
31-
return engine;
32-
}
33-
3423
class DogFirestoreEngine {
35-
static DogFirestoreEngine? _instance;
36-
3724
static DogFirestoreEngine get instance {
38-
return _instance ??= DogFirestoreEngine._(null,null);
25+
return dogs.getMeta<DogFirestoreEngine>();
3926
}
4027

4128
late final DogEngine engine;
4229
late final FirebaseFirestore firestore;
4330
late final OperationModeCacheEntry<FirestoreDocumentOpmode> mode;
4431

45-
DogFirestoreEngine._(DogEngine? engine, FirebaseFirestore? firestore) {
46-
firestore ??= FirebaseFirestore.instance;
47-
engine ??= DogEngine.instance;
48-
this.engine = createFirebaseDogsEngine(engine);
32+
DogFirestoreEngine(DogEngine engine, FirebaseFirestore firestore) {
33+
this.engine = engine;
4934
this.firestore = firestore;
5035
mode = engine.modeRegistry.entry<FirestoreDocumentOpmode>();
5136
}
5237

53-
static void install(DogEngine engine, FirebaseFirestore firestore) {
54-
_instance = DogFirestoreEngine._(engine, firestore);
55-
}
56-
5738
String collectionName<T>() {
5839
var structure = engine.findStructureByType(T)!;
59-
var collectionAnnotation = structure.annotationsOf<Collection>().firstOrNull;
40+
var collectionAnnotation =
41+
structure.annotationsOf<Collection>().firstOrNull;
6042
if (collectionAnnotation != null) {
6143
return collectionAnnotation.name ?? structure.serialName;
6244
}
6345
return structure.serialName;
6446
}
6547

66-
bool checkSubcollection<T,R>() {
48+
bool checkSubcollection<T, R>() {
6749
var structure = engine.findStructureByType(R)!;
68-
var collectionAnnotation = structure.annotationsOf<Collection>().firstOrNull;
50+
var collectionAnnotation =
51+
structure.annotationsOf<Collection>().firstOrNull;
6952
if (collectionAnnotation != null) {
7053
return collectionAnnotation.subcollectionOf == T;
7154
}
@@ -74,24 +57,26 @@ class DogFirestoreEngine {
7457

7558
bool checkRootCollection<T>() {
7659
var structure = engine.findStructureByType(T)!;
77-
var collectionAnnotation = structure.annotationsOf<Collection>().firstOrNull;
60+
var collectionAnnotation =
61+
structure.annotationsOf<Collection>().firstOrNull;
7862
if (collectionAnnotation != null) {
7963
return collectionAnnotation.subcollectionOf == null;
8064
}
8165
return true;
8266
}
8367

84-
CollectionReference<T> applyConverter<T>(CollectionReference<Map<String, dynamic>> collection) {
68+
CollectionReference<T> applyConverter<T>(
69+
CollectionReference<Map<String, dynamic>> collection) {
8570
return collection.withConverter<T>(
8671
fromFirestore: (snapshot, options) {
8772
return mode.forType(T, engine).deserialize(snapshot, engine);
8873
},
89-
toFirestore: (value, options) => mode.forType(T, engine).serialize(value, engine)
90-
);
74+
toFirestore: (value, options) =>
75+
mode.forType(T, engine).serialize(value, engine));
9176
}
9277

9378
CollectionReference<T> collection<T>([String? path]) {
9479
var actualPath = path ?? collectionName<T>();
9580
return applyConverter<T>(firestore.collection(actualPath));
9681
}
97-
}
82+
}

packages/dogs_firestore/lib/src/interop.dart

Lines changed: 72 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,52 +18,94 @@ import 'dart:convert';
1818

1919
import 'package:cloud_firestore/cloud_firestore.dart';
2020
import 'package:dogs_core/dogs_core.dart';
21+
import 'package:dogs_firestore/dogs_firestore.dart';
22+
import 'package:dogs_firestore/src/codec.dart';
23+
import 'package:dogs_firestore/src/converters.dart';
24+
import 'package:dogs_firestore/src/engine.dart';
2125

22-
void installFirebaseInterop([DogEngine? engine]) {
23-
engine ??= DogEngine.instance;
24-
engine.registerAutomatic(FirebaseTimestampConverter());
25-
engine.registerAutomatic(FirebaseGeoPointConverter());
26-
engine.registerAutomatic(FirebaseBlobConverter());
27-
}
26+
// ignore: non_constant_identifier_names
27+
DogPlugin FirebaseDogsPlugin({
28+
FirebaseFirestore? firestore,
29+
bool registerInteropConverters = true,
30+
}) =>
31+
(engine) {
32+
firestore ??= FirebaseFirestore.instance;
33+
34+
if (firestore == null) {
35+
throw ArgumentError(
36+
"FirebaseFirestore instance must be provided or initialized before using FirebaseDogsPlugin.");
37+
}
38+
39+
if (registerInteropConverters) {
40+
engine.registerAutomatic(FirebaseTimestampConverter());
41+
engine.registerAutomatic(FirebaseGeoPointConverter());
42+
engine.registerAutomatic(FirebaseBlobConverter());
43+
}
44+
45+
var forked = engine.getChildOrFork(#Firebase,
46+
codec: FirebaseNativeCodec(), callback: (engine) {
47+
engine.registerAutomatic(DateTimeToTimestampConverter());
48+
engine.registerAutomatic(Uint8ListToBlobConverter());
49+
engine.registerModeFactory(FirestoreDocumentOpmodeFactory());
50+
});
2851

29-
class FirebaseTimestampConverter extends DogConverter<Timestamp> with OperationMapMixin<Timestamp> {
30-
FirebaseTimestampConverter() : super(isAssociated: true, struct: DogStructure<Timestamp>.synthetic("Timestamp"));
52+
final firestoreEngine = DogFirestoreEngine(forked, firestore!);
53+
engine.setMeta<DogFirestoreEngine>(firestoreEngine);
54+
};
55+
56+
class FirebaseTimestampConverter extends DogConverter<Timestamp>
57+
with OperationMapMixin<Timestamp> {
58+
FirebaseTimestampConverter()
59+
: super(
60+
isAssociated: true,
61+
struct: DogStructure<Timestamp>.synthetic("Timestamp"));
3162

3263
@override
3364
Map<Type, OperationMode<Timestamp> Function()> get modes => {
34-
NativeSerializerMode: () => NativeSerializerMode.create(
35-
serializer: (value, engine) => engine.convertObjectToNative(value.toDate(), DateTime),
36-
deserializer: (value, engine) => Timestamp.fromDate(engine.convertObjectFromNative(value, DateTime)),
37-
),
38-
};
65+
NativeSerializerMode: () => NativeSerializerMode.create(
66+
serializer: (value, engine) =>
67+
engine.convertObjectToNative(value.toDate(), DateTime),
68+
deserializer: (value, engine) => Timestamp.fromDate(
69+
engine.convertObjectFromNative(value, DateTime)),
70+
),
71+
};
3972
}
4073

41-
class FirebaseGeoPointConverter extends DogConverter<GeoPoint> with OperationMapMixin<GeoPoint> {
42-
FirebaseGeoPointConverter() : super(isAssociated: true, struct: DogStructure<GeoPoint>.synthetic("GeoPoint"));
74+
class FirebaseGeoPointConverter extends DogConverter<GeoPoint>
75+
with OperationMapMixin<GeoPoint> {
76+
FirebaseGeoPointConverter()
77+
: super(
78+
isAssociated: true,
79+
struct: DogStructure<GeoPoint>.synthetic("GeoPoint"));
4380

4481
@override
4582
Map<Type, OperationMode<GeoPoint> Function()> get modes => {
46-
NativeSerializerMode: () => NativeSerializerMode.create(
47-
serializer: (value, engine) => encode(value),
48-
deserializer: (value, engine) => decode(value),
49-
),
50-
};
83+
NativeSerializerMode: () => NativeSerializerMode.create(
84+
serializer: (value, engine) => encode(value),
85+
deserializer: (value, engine) => decode(value),
86+
),
87+
};
88+
89+
static String encode(GeoPoint value) =>
90+
"${value.latitude},${value.longitude}";
5191

52-
static String encode(GeoPoint value) => "${value.latitude},${value.longitude}";
5392
static GeoPoint decode(String value) {
5493
var parts = value.split(", ");
55-
return GeoPoint(double.parse(parts[0].trim()), double.parse(parts[1].trim()));
94+
return GeoPoint(
95+
double.parse(parts[0].trim()), double.parse(parts[1].trim()));
5696
}
5797
}
5898

59-
class FirebaseBlobConverter extends DogConverter<Blob> with OperationMapMixin<Blob> {
60-
FirebaseBlobConverter() : super(isAssociated: true, struct: DogStructure<Blob>.synthetic("Blob"));
99+
class FirebaseBlobConverter extends DogConverter<Blob>
100+
with OperationMapMixin<Blob> {
101+
FirebaseBlobConverter()
102+
: super(isAssociated: true, struct: DogStructure<Blob>.synthetic("Blob"));
61103

62104
@override
63105
Map<Type, OperationMode<Blob> Function()> get modes => {
64-
NativeSerializerMode: () => NativeSerializerMode.create(
65-
serializer: (value, engine) => base64Encode(value.bytes),
66-
deserializer: (value, engine) => Blob(base64Decode(value)),
67-
),
68-
};
69-
}
106+
NativeSerializerMode: () => NativeSerializerMode.create(
107+
serializer: (value, engine) => base64Encode(value.bytes),
108+
deserializer: (value, engine) => Blob(base64Decode(value)),
109+
),
110+
};
111+
}

smoke/test_firestore/lib/main.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,7 @@ import 'package:test_firestore/dogs.g.dart';
88
import 'models/person.dart';
99
import 'models/town.dart';
1010

11-
Future<void> initialize() async {
12-
await initialiseDogs();
13-
installFirebaseInterop();
14-
}
15-
1611
void main() async {
17-
await initialize();
18-
1912
print("Connecting to Firestore...");
2013
await Firebase.initializeApp(options: FirebaseOptions(apiKey: "", appId: "test", messagingSenderId: "", projectId: "test"));
2114
print("Connected to Firestore");
@@ -25,6 +18,13 @@ void main() async {
2518
persistenceEnabled: false,
2619
);
2720

21+
configureDogs(
22+
plugins: [
23+
GeneratedModelsPlugin(),
24+
FirebaseDogsPlugin()
25+
]
26+
);
27+
2828
// This app doesn't do anything
2929
runApp(const MyApp());
3030
}

smoke/test_firestore/test/widget_test.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,23 @@ import 'package:firebase_core/firebase_core.dart';
66
import 'package:flutter/material.dart';
77
import 'package:flutter_test/flutter_test.dart';
88
import 'package:dogs_firestore/src/engine.dart';
9+
import 'package:test_firestore/dogs.g.dart';
910

1011
import 'package:test_firestore/main.dart';
1112
import 'package:test_firestore/models/person.conv.g.dart';
1213
import 'package:test_firestore/models/person.dart';
1314
import 'package:test_firestore/models/town.dart';
1415

1516
Future<void> main() async {
16-
await initialize();
1717
var fakeFirebaseFirestore = FakeFirebaseFirestore();
18-
DogFirestoreEngine.install(dogs, fakeFirebaseFirestore);
18+
19+
configureDogs(
20+
plugins: [
21+
GeneratedModelsPlugin(),
22+
FirebaseDogsPlugin(firestore: fakeFirebaseFirestore)
23+
]
24+
);
25+
1926
group("Basic Tests", () {
2027
late Town town;
2128
late Person person;

0 commit comments

Comments
 (0)