1+ module Paperbits . Firebase {
2+ import IObjectStorage = Paperbits . Persistence . IObjectStorage ;
3+ import FirebaseService = Paperbits . Firebase . FirebaseService ;
4+
5+ export class FirebaseObjectStorage implements IObjectStorage {
6+ private firebaseService : FirebaseService ;
7+
8+ constructor ( firebaseService : FirebaseService ) {
9+ this . firebaseService = firebaseService ;
10+ }
11+
12+ public addObject < T > ( path : string , dataObject : T ) : Promise < void > {
13+ return new Promise < void > ( ( resolve , reject ) => {
14+ this . firebaseService . getDatabaseRef ( ) . then ( ( databaseRef ) => {
15+ if ( path ) {
16+ databaseRef . child ( path ) . set ( dataObject , ( error ) => {
17+ if ( error ) {
18+ reject ( [ `Could not add object '${ path } '. Error: ${ error } .` ] ) ;
19+ } else {
20+ resolve ( ) ;
21+ }
22+ } ) ;
23+ }
24+ else {
25+ databaseRef . update ( dataObject , ( error ) => {
26+ if ( error ) {
27+ reject ( [ `Could not add object '${ path } '. Error: ${ error } .` ] ) ;
28+ } else {
29+ resolve ( ) ;
30+ }
31+ } ) ;
32+ }
33+ } ) ;
34+ } ) ;
35+ }
36+
37+ public getObject < T > ( path : string ) : Promise < T > {
38+ return new Promise < T > ( ( resolve , reject ) => {
39+ this . firebaseService . getDatabaseRef ( ) . then ( ( databaseRef ) => {
40+ databaseRef . child ( path ) . once ( "value" ,
41+ ( snapshot ) => {
42+ resolve ( snapshot . val ( ) ) ;
43+ } , ( error ) => {
44+ reject ( [ `Could not retrieve object '${ path } '. Error: ${ error } .` ] ) ;
45+ } ) ;
46+ } ) ;
47+ } ) ;
48+ }
49+
50+ public deleteObject ( path : string ) : Promise < void > {
51+ return new Promise < void > ( ( resolve , reject ) => {
52+ this . firebaseService . getDatabaseRef ( ) . then ( ( databaseRef ) => {
53+ databaseRef . child ( path ) . remove ( ( error : string ) => {
54+ if ( error ) {
55+ reject ( [ `Could not delete object '${ path } '. Error: ${ error } .` ] ) ;
56+ } else {
57+ resolve ( ) ;
58+ }
59+ } ) ;
60+ } ) ;
61+ } ) ;
62+ }
63+
64+ public updateObject < T > ( path : string , dataObject : T ) : Promise < T > {
65+ return new Promise < T > ( ( resolve , reject ) => {
66+ this . firebaseService . getDatabaseRef ( ) . then ( ( databaseRef ) => {
67+ databaseRef . child ( path ) . update ( dataObject ,
68+ error => {
69+ if ( error ) {
70+ reject ( [ `Could not update object '${ path } '. Error: ${ error } ` ] ) ;
71+ } else {
72+ resolve ( dataObject ) ;
73+ }
74+ } ) ;
75+ } ) ;
76+ } ) ;
77+ }
78+
79+ public searchObjects < T > ( path : string , propertyNames ?: Array < string > , searchValue ?: string , startAtSearch ?: boolean , skipLoadObject ?: boolean ) : Promise < Array < T > > {
80+ return new Promise < Array < T > > ( ( resolve , reject ) => {
81+ this . firebaseService . getDatabaseRef ( ) . then ( ( databaseRef ) => {
82+ if ( propertyNames && propertyNames . length && searchValue ) {
83+ var searchTasks = propertyNames . map ( ( propertyName ) => {
84+ let query : FirebaseQuery = startAtSearch
85+ ? databaseRef . child ( path ) . orderByChild ( propertyName ) . startAt ( searchValue )
86+ : databaseRef . child ( path ) . orderByChild ( propertyName ) . equalTo ( searchValue ) ;
87+
88+ return query . once ( "value" ) . then ( ( result ) => this . collectResult ( result ) ) ;
89+ } ) ;
90+
91+ Promise . all ( searchTasks ) . then (
92+ ( searchTaskResults ) => {
93+ resolve ( _ . flatten ( searchTaskResults ) ) ;
94+ } ,
95+ ( error ) => {
96+ return [ `Could not search object '${ path } '. Error: ${ error } .` ] ;
97+ } ) ;
98+ }
99+ else {
100+ //return all objects
101+
102+ databaseRef . child ( path ) . once ( "value" ,
103+ ( objectData ) => {
104+ let result = this . collectResult ( objectData ) ;
105+ resolve ( result ) ;
106+ } ,
107+ ( error ) => {
108+ reject ( [ `Could not search object '${ path } '. Error: ${ error } .` ] ) ;
109+ }
110+ ) ;
111+ }
112+ } ) ;
113+ } ) ;
114+ }
115+
116+ private collectResult ( objectData ) {
117+ let result = [ ] ;
118+
119+ if ( objectData . hasChildren ( ) ) {
120+ let items = objectData . val ( ) ;
121+
122+ if ( items ) {
123+ if ( _ . isArray ( items ) ) {
124+ items . map ( ( item ) => result . push ( item ) ) ;
125+ } else {
126+ _ . mapObject ( items , ( item ) => {
127+ result . push ( item )
128+ } ) ;
129+ }
130+ }
131+ }
132+ return result ;
133+ } ;
134+ }
135+ }
0 commit comments