Skip to content

Commit 3e7c771

Browse files
committed
Updated db to use modifiers on iOS
1 parent 55a60be commit 3e7c771

File tree

3 files changed

+102
-23
lines changed

3 files changed

+102
-23
lines changed

ios/Firestack/FirestackDatabase.m

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ @implementation FirestackDatabase
1616
RCT_EXPORT_MODULE(FirestackDatabase);
1717

1818
RCT_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

3739
RCT_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

5660
RCT_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

105111
RCT_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

139147
RCT_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
{

lib/firestackModule.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ export class FirestackModule {
5757
}
5858

5959
makeRef(path) {
60-
const refName = '/' + [this._refName, path].join('/');
61-
const ref = this._firestack.database.ref(refName);
60+
const refName = [this._refName, path]
61+
const ref = this._firestack.database.ref(...refName);
6262
return this._makeRef(ref);
6363
}
6464

lib/modules/database.js

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class DatabaseRef {
3939
(typeof path == 'string' ?
4040
[path] : []);
4141

42-
this.dbModifiers = [];
42+
this.dbSort = null;
43+
this.dbFilters = [];
4344

4445
this.handles = [];
4546

@@ -68,32 +69,38 @@ class DatabaseRef {
6869
// Get the value of a ref either with a key
6970
getAt(key) {
7071
const {path} = this.dbPath([key]);
71-
return promisify('onOnce', FirestackDatabase)(path, 'value');
72+
const modifiers = this.dbModifiers();
73+
return promisify('onOnce', FirestackDatabase)(path, modifiers, 'value');
7274
}
7375

7476
setAt(key, val) {
7577
const {path, value} = this.dbPath([key, val]);
76-
return promisify('set', FirestackDatabase)(path, value)
78+
const modifiers = this.dbModifiers();
79+
return promisify('set', FirestackDatabase)(path, modifiers, value)
7780
}
7881

7982
updateAt(key, val) {
8083
const {path, value} = this.dbPath([key, val]);
81-
return promisify('update', FirestackDatabase)(path, value)
84+
const modifiers = this.dbModifiers();
85+
return promisify('update', FirestackDatabase)(path, modifiers, value)
8286
}
8387

8488
removeAt(key) {
8589
const {path} = this.dbPath([key]);
86-
return promisify('remove', FirestackDatabase)(path)
90+
const modifiers = this.dbModifiers();
91+
return promisify('remove', FirestackDatabase)(path, modifiers)
8792
}
8893

8994
push(value={}) {
9095
const {path} = this.dbPath();
91-
return promisify('push', FirestackDatabase)(path, value)
96+
const modifiers = this.dbModifiers();
97+
return promisify('push', FirestackDatabase)(path, modifiers, value)
9298
.then(({ref}) => new DatabaseRef(this.db, ref))
9399
}
94100

95101
on(evt, cb) {
96102
const {path, value} = this.dbPath();
103+
const modifiers = this.dbModifiers();
97104

98105
this.db.on(evt, (data) => {
99106
this.db.log.debug('Got a snapshot', data, 'at', path);
@@ -103,7 +110,7 @@ class DatabaseRef {
103110
}
104111
}, FirestackDatabaseEvt);
105112

106-
return promisify('on', FirestackDatabase)(path, evt)
113+
return promisify('on', FirestackDatabase)(path, modifiers, evt)
107114
.then(handle => {
108115
this.handles.push(handle.handle);
109116
return handle;
@@ -112,7 +119,8 @@ class DatabaseRef {
112119

113120
once(evt) {
114121
const {path} = this.dbPath();
115-
return promisify('onOnce', FirestackDatabase)(path, evt)
122+
const modifiers = this.dbModifiers();
123+
return promisify('onOnce', FirestackDatabase)(path, modifiers, evt)
116124
}
117125

118126
off(evt) {
@@ -132,42 +140,43 @@ class DatabaseRef {
132140

133141
// Modifiers
134142
orderByKey() {
135-
this.dbModifiers.push('orderByKey');
143+
this.dbSort = 'orderByKey';
136144
return this;
137145
}
138146

139147
orderByPriority() {
140-
this.dbModifiers.push('orderByPriority');
148+
this.dbSort = 'orderByPriority';
141149
return this;
142150
}
143151

144152
orderByValue() {
145-
this.dbModifiers.push('orderByValue');
153+
this.dbSort = 'orderByValue';
146154
return this;
147155
}
148156

149157
orderByChild(key) {
150-
this.dbModifiers.push(`orderByChild:${key}`)
158+
this.dbSort = `orderByChild:${key}`
151159
return this;
152160
}
153161

162+
154163
limitToLast(limit) {
155-
this.dbModifiers.push(`limitToLast:${limit}`)
164+
this.dbFilters.push(`limitToLast:${limit}`)
156165
return this;
157166
}
158167

159168
limitToFirst(limit) {
160-
this.dbModifiers.push(`limitToFirst:${limit}`)
169+
this.dbFilters.push(`limitToFirst:${limit}`)
161170
return this;
162171
}
163172

164173
equalTo(value, key) {
165-
this.dbModifiers.push(`equalTo:${value}:${key}`)
174+
this.dbFilters.push(`equalTo:${value}:${key}`)
166175
return this;
167176
}
168177

169178
endAt(value, key) {
170-
this.dbModifiers.push(`endAt:${value}:${key}`)
179+
this.dbFilters.push(`endAt:${value}:${key}`)
171180
return this;
172181
}
173182

@@ -206,6 +215,17 @@ class DatabaseRef {
206215
}
207216
return {path: pathStr, value, key};
208217
}
218+
219+
dbModifiers() {
220+
let arr = [];
221+
if (this.dbSort) {
222+
arr.push(this.dbSort);
223+
}
224+
if (this.dbFilters.length > 0) {
225+
arr = arr.concat(this.dbFilters);
226+
}
227+
return arr;
228+
}
209229
}
210230

211231
export class Database extends Base {

0 commit comments

Comments
 (0)