1
+ import 'dart:convert' ;
2
+ import 'dart:typed_data' ;
3
+
1
4
import 'package:firebase_admin/src/firestore/document.dart' ;
2
5
import 'package:googleapis/firestore/v1.dart' ;
6
+ import 'package:maps_toolkit/maps_toolkit.dart' as maps_toolkit;
7
+
8
+ import '../firestore.dart' ;
3
9
4
10
Map <String , dynamic > fromFirestore (DocumentSnapshot <Map <String , dynamic >> snapshot) =>
5
11
snapshot.data ();
6
12
7
13
Map <String , dynamic > toFirestore (Map <String , dynamic > value) => value;
8
14
9
- Map <String , dynamic > deserializeData (Map <String , Value > fields) {
10
- return fields.map ((key, value) => MapEntry (key, deserializeValue (value)));
15
+ Map <String , dynamic > deserializeData (Firestore firestore, Map <String , Value > fields) {
16
+ return fields.map ((key, value) => MapEntry (key, deserializeValue (firestore, value)));
11
17
}
12
18
13
19
Map <String , Value > serializeData (Map <String , dynamic > data) {
14
20
return data.map ((key, value) => MapEntry (key, serializeValue (value)));
15
21
}
16
22
17
- dynamic deserializeValue (Value value) {
23
+ dynamic deserializeValue (Firestore firestore, Value value) {
18
24
if (value.arrayValue != null ) {
19
- return value.arrayValue! .values! .map (deserializeValue).toList ();
25
+ return value.arrayValue! .values! .map ((value) => deserializeValue (firestore, value) ).toList ();
20
26
} else if (value.booleanValue != null ) {
21
27
return value.booleanValue! ;
22
28
} else if (value.bytesValue != null ) {
23
- return null ;
29
+ return base64. decode (value.bytesValue ! ) ;
24
30
} else if (value.doubleValue != null ) {
25
31
return value.doubleValue! ;
26
32
} else if (value.geoPointValue != null ) {
27
- return null ;
33
+ return maps_toolkit. LatLng (value.geoPointValue ! .latitude ! , value.geoPointValue ! .longitude ! ) ;
28
34
} else if (value.integerValue != null ) {
29
35
return int .parse (value.integerValue! );
30
36
} else if (value.mapValue != null ) {
31
- return deserializeData (value.mapValue! .fields! );
37
+ return deserializeData (firestore, value.mapValue! .fields! );
32
38
} else if (value.nullValue != null ) {
33
39
return null ;
34
40
} else if (value.referenceValue != null ) {
35
- return null ;
41
+ return DocumentReference <Map <String , dynamic >>(
42
+ firestore: firestore,
43
+ fromFirestore: fromFirestore,
44
+ toFirestore: toFirestore,
45
+ path: value.referenceValue! ,
46
+ );
36
47
} else if (value.stringValue != null ) {
37
48
return value.stringValue! ;
38
49
} else if (value.timestampValue != null ) {
@@ -44,13 +55,16 @@ Value serializeValue(dynamic data) {
44
55
return Value (
45
56
arrayValue: data is List ? ArrayValue (values: data.map (serializeValue).toList ()) : null ,
46
57
booleanValue: data is bool ? data : null ,
47
- bytesValue: null ,
58
+ bytesValue:
59
+ data is Uint8List ? base64.encode (data).replaceAll ('/' , '_' ).replaceAll ('+' , '-' ) : null ,
48
60
doubleValue: data is double ? data : null ,
49
- geoPointValue: null ,
61
+ geoPointValue: data is maps_toolkit.LatLng
62
+ ? LatLng (latitude: data.latitude, longitude: data.longitude)
63
+ : null ,
50
64
integerValue: data is int ? '$data ' : null ,
51
65
mapValue: data is Map <String , dynamic > ? MapValue (fields: serializeData (data)) : null ,
52
66
nullValue: data == null ? 'nullValue' : null ,
53
- referenceValue: null ,
67
+ referenceValue: data is DocumentReference < Map < String , dynamic >> ? data.path : null ,
54
68
stringValue: data is String ? data : null ,
55
69
timestampValue: data is DateTime ? '${data .microsecondsSinceEpoch }' : null ,
56
70
);
0 commit comments