1+ import 'dart:convert' ;
2+ import 'dart:typed_data' ;
3+
14import 'package:firebase_admin/src/firestore/document.dart' ;
25import 'package:googleapis/firestore/v1.dart' ;
6+ import 'package:maps_toolkit/maps_toolkit.dart' as maps_toolkit;
7+
8+ import '../firestore.dart' ;
39
410Map <String , dynamic > fromFirestore (DocumentSnapshot <Map <String , dynamic >> snapshot) =>
511 snapshot.data ();
612
713Map <String , dynamic > toFirestore (Map <String , dynamic > value) => value;
814
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)));
1117}
1218
1319Map <String , Value > serializeData (Map <String , dynamic > data) {
1420 return data.map ((key, value) => MapEntry (key, serializeValue (value)));
1521}
1622
17- dynamic deserializeValue (Value value) {
23+ dynamic deserializeValue (Firestore firestore, Value value) {
1824 if (value.arrayValue != null ) {
19- return value.arrayValue! .values! .map (deserializeValue).toList ();
25+ return value.arrayValue! .values! .map ((value) => deserializeValue (firestore, value) ).toList ();
2026 } else if (value.booleanValue != null ) {
2127 return value.booleanValue! ;
2228 } else if (value.bytesValue != null ) {
23- return null ;
29+ return base64. decode (value.bytesValue ! ) ;
2430 } else if (value.doubleValue != null ) {
2531 return value.doubleValue! ;
2632 } else if (value.geoPointValue != null ) {
27- return null ;
33+ return maps_toolkit. LatLng (value.geoPointValue ! .latitude ! , value.geoPointValue ! .longitude ! ) ;
2834 } else if (value.integerValue != null ) {
2935 return int .parse (value.integerValue! );
3036 } else if (value.mapValue != null ) {
31- return deserializeData (value.mapValue! .fields! );
37+ return deserializeData (firestore, value.mapValue! .fields! );
3238 } else if (value.nullValue != null ) {
3339 return null ;
3440 } 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+ );
3647 } else if (value.stringValue != null ) {
3748 return value.stringValue! ;
3849 } else if (value.timestampValue != null ) {
@@ -44,13 +55,16 @@ Value serializeValue(dynamic data) {
4455 return Value (
4556 arrayValue: data is List ? ArrayValue (values: data.map (serializeValue).toList ()) : null ,
4657 booleanValue: data is bool ? data : null ,
47- bytesValue: null ,
58+ bytesValue:
59+ data is Uint8List ? base64.encode (data).replaceAll ('/' , '_' ).replaceAll ('+' , '-' ) : null ,
4860 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 ,
5064 integerValue: data is int ? '$data ' : null ,
5165 mapValue: data is Map <String , dynamic > ? MapValue (fields: serializeData (data)) : null ,
5266 nullValue: data == null ? 'nullValue' : null ,
53- referenceValue: null ,
67+ referenceValue: data is DocumentReference < Map < String , dynamic >> ? data.path : null ,
5468 stringValue: data is String ? data : null ,
5569 timestampValue: data is DateTime ? '${data .microsecondsSinceEpoch }' : null ,
5670 );
0 commit comments