@@ -16,10 +16,12 @@ @implementation FirestackDatabase
1616RCT_EXPORT_MODULE (FirestackDatabase);
1717
1818RCT_EXPORT_METHOD (set:(NSString *) path
19+ modifiers:(NSArray *) modifiers
1920 value:(NSDictionary *)value
2021 callback:(RCTResponseSenderBlock) callback)
2122{
22- FIRDatabaseReference *ref = [self getRefAtPath: path];
23+ FIRDatabaseReference *ref = [self getRefAtPathWithModifiers: path
24+ modifiers: modifiers];
2325
2426 [ref setValue: value withCompletionBlock: ^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
2527 if (error != nil ) {
@@ -35,10 +37,12 @@ @implementation FirestackDatabase
3537}
3638
3739RCT_EXPORT_METHOD (update:(NSString *) path
40+ modifiers:(NSArray *) modifiers
3841 value:(NSDictionary *)value
3942 callback:(RCTResponseSenderBlock) callback)
4043{
41- FIRDatabaseReference *ref = [self getRefAtPath: path];
44+ FIRDatabaseReference *ref = [self getRefAtPathWithModifiers: path
45+ modifiers: modifiers];
4246
4347 [ref updateChildValues: value withCompletionBlock: ^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
4448 if (error != nil ) {
@@ -54,9 +58,11 @@ @implementation FirestackDatabase
5458}
5559
5660RCT_EXPORT_METHOD (remove:(NSString *) path
61+ modifiers:(NSArray *) modifiers
5762 callback:(RCTResponseSenderBlock) callback)
5863{
59- FIRDatabaseReference *ref = [self getRefAtPath: path];
64+ FIRDatabaseReference *ref = [self getRefAtPathWithModifiers: path
65+ modifiers: modifiers];
6066 [ref removeValueWithCompletionBlock: ^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
6167 if (error != nil ) {
6268 // Error handling
@@ -103,14 +109,16 @@ @implementation FirestackDatabase
103109
104110
105111RCT_EXPORT_METHOD (on:(NSString *) path
112+ modifiers:(NSArray *) modifiers
106113 name:(NSString *) name
107114 callback:(RCTResponseSenderBlock) callback)
108115{
109116
110117 int eventType = [self eventTypeFromName: name];
111118 NSLog (@" Calling observeEventType: at path: %@ %@ " , path, name);
112119
113- FIRDatabaseReference *ref = [self getRefAtPath: path];
120+ FIRDatabaseReference *ref = [self getRefAtPathWithModifiers: path
121+ modifiers: modifiers];
114122
115123 FIRDatabaseHandle handle = [ref observeEventType: eventType
116124 withBlock: ^(FIRDataSnapshot * _Nonnull snapshot) {
@@ -137,12 +145,13 @@ @implementation FirestackDatabase
137145}
138146
139147RCT_EXPORT_METHOD (onOnce:(NSString *) path
148+ modifiers:(NSArray *) modifiers
140149 name:(NSString *) name
141150 callback:(RCTResponseSenderBlock) callback)
142151{
143152 int eventType = [self eventTypeFromName: name];
144153
145- FIRDatabaseReference *ref = [self getRefAtPath : path];
154+ FIRDatabaseReference *ref = [self getRefAtPathWithModifiers : path modifiers: modifiers ];
146155 [ref observeSingleEventOfType: eventType
147156 withBlock: ^(FIRDataSnapshot * _Nonnull snapshot) {
148157 callback (@[[NSNull null ], [self snapshotToDict: snapshot]]);
@@ -200,6 +209,56 @@ - (FIRDatabaseReference *) getRefAtPath:(NSString *) str
200209 return [rootRef child: str];
201210}
202211
212+ - (FIRDatabaseReference *) getRefAtPathWithModifiers : (NSString *) str
213+ modifiers : (NSArray *) modifiers
214+ {
215+ FIRDatabaseReference *rootRef = [[[FIRDatabase database ] reference ] child: str];
216+
217+ FIRDatabaseQuery *query;
218+ for (NSString *str in modifiers) {
219+ if ([str isEqualToString: @" orderByKey" ]) {
220+ query = [rootRef queryOrderedByKey ];
221+ } else if ([str isEqualToString: @" orderByPriority" ]) {
222+ query = [rootRef queryOrderedByPriority ];
223+ } else if ([str isEqualToString: @" orderByValue" ]) {
224+ query = [rootRef queryOrderedByValue ];
225+ } else if ([str containsString: @" orderByChild" ]) {
226+ NSArray *args = [str componentsSeparatedByString: @" :" ];
227+ NSString *key = args[1 ];
228+ NSLog (@" Key in orderByChild: %@ " , key);
229+ query = [rootRef queryOrderedByChild: key];
230+ } else if ([str containsString: @" limitToLast" ]) {
231+ NSArray *args = [str componentsSeparatedByString: @" :" ];
232+ NSString *key = args[1 ];
233+ NSUInteger limit = key.integerValue ;
234+ query = [query queryLimitedToLast: limit];
235+ } else if ([str containsString: @" limitToFirst" ]) {
236+ NSArray *args = [str componentsSeparatedByString: @" :" ];
237+ NSString *key = args[1 ];
238+ NSUInteger limit = key.integerValue ;
239+ query = [query queryLimitedToFirst: limit];
240+ } else if ([str containsString: @" equalTo" ]) {
241+ NSArray *args = [str componentsSeparatedByString: @" :" ];
242+ NSString *value = args[1 ];
243+ NSString *key = args[2 ];
244+ query = [query queryEqualToValue: value
245+ childKey: key];
246+ } else if ([str containsString: @" endAt" ]) {
247+ NSArray *args = [str componentsSeparatedByString: @" :" ];
248+ NSString *value = args[1 ];
249+ NSString *key = args[2 ];
250+ query = [query queryEndingAtValue: value
251+ childKey: key];
252+ }
253+ }
254+
255+ if (query == nil ) {
256+ return rootRef;
257+ } else {
258+ return query.ref ;
259+ }
260+ }
261+
203262// Handles
204263- (NSDictionary *) storedDBHandles
205264{
0 commit comments