11import * as admin from "firebase-admin" ;
2+ import { ITimestamp } from "../interfaces/ITimestamp" ;
3+ import { IGeopoint } from "../interfaces/IGeopoint" ;
4+ import { IDocumentReference } from "../interfaces/IDocumentReference" ;
25import DocumentReference = admin . firestore . DocumentReference ;
36import GeoPoint = admin . firestore . GeoPoint ;
47import Firestore = FirebaseFirestore . Firestore ;
@@ -16,51 +19,75 @@ const array_chunks = (array: Array<any>, chunk_size: number): Array<Array<any>>
1619const serializeSpecialTypes = ( data : any ) => {
1720 const cleaned : any = { } ;
1821 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 ) ;
2947 if ( isArray ) {
30- value = Object . keys ( value ) . map ( key => value [ key ] ) ;
48+ rawValue = Object . keys ( rawValue ) . map ( key => rawValue [ key ] ) ;
3149 }
3250 }
33- cleaned [ key ] = value ;
51+ cleaned [ key ] = rawValue ;
3452 } ) ;
3553 return cleaned ;
3654} ;
3755
3856const unserializeSpecialTypes = ( data : any , fs : Firestore ) => {
3957 const cleaned : any = { } ;
4058 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__ ) {
4564 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+ }
4772 break ;
4873 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 ) ;
5076 break ;
5177 case 'documentReference' :
52- value = fs . doc ( value . value ) ;
78+ rawValue = rawValue as IDocumentReference ;
79+ rawValue = fs . doc ( rawValue . value ) ;
5380 break ;
5481 }
5582 } else {
56- let isArray = Array . isArray ( value ) ;
57- value = unserializeSpecialTypes ( value , fs ) ;
83+ let isArray = Array . isArray ( rawValue ) ;
84+ cleanedValue = unserializeSpecialTypes ( rawValue , fs ) ;
5885 if ( isArray ) {
59- value = Object . keys ( value ) . map ( key => value [ key ] )
86+ cleanedValue = Object . keys ( rawValue ) . map ( key => rawValue [ key ] )
6087 }
6188 }
6289 }
63- cleaned [ key ] = value ;
90+ cleaned [ key ] = cleanedValue ;
6491 } ) ;
6592 return cleaned ;
6693} ;
0 commit comments