1
1
import * as admin from "firebase-admin" ;
2
+ import { ITimestamp } from "../interfaces/ITimestamp" ;
3
+ import { IGeopoint } from "../interfaces/IGeopoint" ;
4
+ import { IDocumentReference } from "../interfaces/IDocumentReference" ;
2
5
import DocumentReference = admin . firestore . DocumentReference ;
3
6
import GeoPoint = admin . firestore . GeoPoint ;
4
7
import Firestore = FirebaseFirestore . Firestore ;
@@ -16,51 +19,75 @@ const array_chunks = (array: Array<any>, chunk_size: number): Array<Array<any>>
16
19
const serializeSpecialTypes = ( data : any ) => {
17
20
const cleaned : any = { } ;
18
21
Object . keys ( data ) . map ( key => {
19
- let value = data [ key ] ;
20
- if ( value instanceof admin . firestore . Timestamp ) {
21
- value = { __datatype__ : 'timestamp' , value : { seconds : value . seconds , nanoseconds : value . nanoseconds } } ;
22
- } else if ( value instanceof GeoPoint ) {
23
- value = { __datatype__ : 'geopoint' , value : value } ;
24
- } else if ( value instanceof DocumentReference ) {
25
- value = { __datatype__ : 'documentReference' , value : value . path } ;
26
- } else if ( value === Object ( value ) ) {
27
- let isArray = Array . isArray ( value ) ;
28
- value = serializeSpecialTypes ( value ) ;
22
+ let rawValue = data [ key ] ;
23
+ if ( rawValue instanceof admin . firestore . Timestamp ) {
24
+ rawValue = {
25
+ __datatype__ : 'timestamp' ,
26
+ value : {
27
+ _seconds : rawValue . seconds ,
28
+ _nanoseconds : rawValue . nanoseconds
29
+ }
30
+ } as ITimestamp ;
31
+ } else if ( rawValue instanceof GeoPoint ) {
32
+ rawValue = {
33
+ __datatype__ : 'geopoint' ,
34
+ value : {
35
+ _latitude : rawValue . latitude ,
36
+ _longitude : rawValue . longitude
37
+ }
38
+ } as IGeopoint ;
39
+ } else if ( rawValue instanceof DocumentReference ) {
40
+ rawValue = {
41
+ __datatype__ : 'documentReference' ,
42
+ value : rawValue . path
43
+ } as IDocumentReference ;
44
+ } else if ( rawValue === Object ( rawValue ) ) {
45
+ let isArray = Array . isArray ( rawValue ) ;
46
+ rawValue = serializeSpecialTypes ( rawValue ) ;
29
47
if ( isArray ) {
30
- value = Object . keys ( value ) . map ( key => value [ key ] ) ;
48
+ rawValue = Object . keys ( rawValue ) . map ( key => rawValue [ key ] ) ;
31
49
}
32
50
}
33
- cleaned [ key ] = value ;
51
+ cleaned [ key ] = rawValue ;
34
52
} ) ;
35
53
return cleaned ;
36
54
} ;
37
55
38
56
const unserializeSpecialTypes = ( data : any , fs : Firestore ) => {
39
57
const cleaned : any = { } ;
40
58
Object . keys ( data ) . map ( key => {
41
- let value = data [ key ] ;
42
- if ( value instanceof Object ) {
43
- if ( '__datatype__' in value && 'value' in value ) {
44
- switch ( value . __datatype__ ) {
59
+ let rawValue : any = data [ key ] ;
60
+ let cleanedValue : any ;
61
+ if ( rawValue instanceof Object ) {
62
+ if ( '__datatype__' in rawValue && 'value' in rawValue ) {
63
+ switch ( rawValue . __datatype__ ) {
45
64
case 'timestamp' :
46
- value = new admin . firestore . Timestamp ( value . value . _seconds , value . value . _nanoseconds ) ;
65
+ rawValue = rawValue as ITimestamp ;
66
+ if ( rawValue . value instanceof String ) {
67
+ const millis = Date . parse ( rawValue . value ) ;
68
+ cleanedValue = new admin . firestore . Timestamp ( millis / 1000 , 0 ) ;
69
+ } else {
70
+ cleanedValue = new admin . firestore . Timestamp ( rawValue . value . _seconds , rawValue . value . _nanoseconds ) ;
71
+ }
47
72
break ;
48
73
case 'geopoint' :
49
- value = new admin . firestore . GeoPoint ( value . value . _latitude , value . value . _longitude ) ;
74
+ rawValue = rawValue as IGeopoint ;
75
+ cleanedValue = new admin . firestore . GeoPoint ( rawValue . value . _latitude , rawValue . value . _longitude ) ;
50
76
break ;
51
77
case 'documentReference' :
52
- value = fs . doc ( value . value ) ;
78
+ rawValue = rawValue as IDocumentReference ;
79
+ rawValue = fs . doc ( rawValue . value ) ;
53
80
break ;
54
81
}
55
82
} else {
56
- let isArray = Array . isArray ( value ) ;
57
- value = unserializeSpecialTypes ( value , fs ) ;
83
+ let isArray = Array . isArray ( rawValue ) ;
84
+ cleanedValue = unserializeSpecialTypes ( rawValue , fs ) ;
58
85
if ( isArray ) {
59
- value = Object . keys ( value ) . map ( key => value [ key ] )
86
+ cleanedValue = Object . keys ( rawValue ) . map ( key => rawValue [ key ] )
60
87
}
61
88
}
62
89
}
63
- cleaned [ key ] = value ;
90
+ cleaned [ key ] = cleanedValue ;
64
91
} ) ;
65
92
return cleaned ;
66
93
} ;
0 commit comments