Skip to content

Commit 3b61735

Browse files
committed
refator(db): add remove method
1 parent 0048ca3 commit 3b61735

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed

src/database/interfaces.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ export interface ListReference<T> {
77
query: DatabaseQuery;
88
valueChanges<T>(events?: ChildEvent[]): Observable<T[]>;
99
snapshotChanges<T>(events?: ChildEvent[]): Observable<DatabaseSnapshot[]>;
10-
update(item: FirebaseOperation, data: T): Promise<any>;
11-
set(item: FirebaseOperation, data: T): Promise<any>;
12-
push(data: T): Promise<any>;
13-
remove(item: FirebaseOperation): Promise<any>;
10+
update(item: FirebaseOperation, data: T): Promise<void>;
11+
set(item: FirebaseOperation, data: T): Promise<void>;
12+
push(data: T): firebase.database.ThenableReference;
13+
remove(item?: FirebaseOperation): Promise<any>;
1414
}
1515

1616
export interface ObjectReference<T> {
@@ -20,10 +20,10 @@ export interface ObjectReference<T> {
2020
}
2121

2222
export interface FirebaseOperationCases {
23-
stringCase: () => firebase.Promise<void>;
24-
firebaseCase?: () => firebase.Promise<void>;
25-
snapshotCase?: () => firebase.Promise<void>;
26-
unwrappedSnapshotCase?: () => firebase.Promise<void>;
23+
stringCase: () => Promise<void | any>;
24+
firebaseCase?: () => Promise<void | any>;
25+
snapshotCase?: () => Promise<void | any>;
26+
unwrappedSnapshotCase?: () => Promise<void | any>;
2727
}
2828

2929
export type QueryFn = (ref: DatabaseReference) => DatabaseQuery;

src/database/list/data-operation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DatabaseReference, FirebaseOperation, DatabaseSnapshot } from '../inter
33
import { checkOperationCases } from '../utils';
44

55
export function createDataOperationMethod<T>(ref: DatabaseReference, operation: string) {
6-
return function dataOperation<T>(item: FirebaseOperation, value: T): Promise<any> {
6+
return function dataOperation<T>(item: FirebaseOperation, value: T) {
77
return checkOperationCases(item, {
88
stringCase: () => ref.child(<string>item)[operation](value),
99
firebaseCase: () => (<DatabaseReference>item)[operation](value),

src/database/list/remove.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ import { checkOperationCases } from '../utils';
33
import { createDataOperationMethod } from './data-operation';
44
import { database, Promise } from 'firebase/app';
55

6+
// TODO(davideast): Find out why TS thinks this returns firebase.Primise
7+
// instead of Promise.
68
export function createRemoveMethod(ref: DatabaseReference) {
7-
return function remove(item?: FirebaseOperation) {
8-
if(!item) { return ref.remove(); }
9-
return createDataOperationMethod(ref, 'remove')(item, null)
9+
return function remove(item?: FirebaseOperation): any {
10+
if(!item) { return ref.remove() as any; }
11+
return checkOperationCases(item, {
12+
stringCase: () => ref.child(<string>item).remove() as any,
13+
firebaseCase: () => (<DatabaseReference>item).remove() as any,
14+
snapshotCase: () => (<DatabaseSnapshot>item).ref.remove() as any
15+
}) as any;
1016
}
1117
}
1218

src/database/utils.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@ import * as firebase from 'firebase/app';
22
import { Subscription } from 'rxjs/Subscription';
33
import { Scheduler } from 'rxjs/Scheduler';
44
import { queue } from 'rxjs/scheduler/queue';
5-
import { PathReference, DatabaseReference } from './interfaces';
5+
import { PathReference, DatabaseReference, FirebaseOperation, FirebaseOperationCases } from './interfaces';
66
import { FirebaseApp } from 'angularfire2';
77

88
const REGEX_ABSOLUTE_URL = /^[a-z]+:\/\/.*/;
99

10+
export function isString(value: any): boolean {
11+
return typeof value === 'string';
12+
}
13+
14+
export function isFirebaseDataSnapshot(value: any): boolean {
15+
return typeof value.exportVal === 'function';
16+
}
17+
1018
export function isNil(obj: any): boolean {
1119
return obj === undefined || obj === null;
1220
}
@@ -56,15 +64,13 @@ export function getRef(app: FirebaseApp, pathRef: PathReference): DatabaseRefere
5664
return app.database().ref(path);
5765
}
5866

59-
export function checkOperationCases(item: FirebaseOperation, cases: FirebaseOperationCases) : firebase.Promise<void> {
60-
if (utils.isString(item)) {
67+
export function checkOperationCases(item: FirebaseOperation, cases: FirebaseOperationCases) : Promise<void | any> {
68+
if (isString(item)) {
6169
return cases.stringCase();
62-
} else if (utils.isFirebaseRef(item)) {
70+
} else if (isFirebaseRef(item)) {
6371
return cases.firebaseCase!();
64-
} else if (utils.isFirebaseDataSnapshot(item)) {
72+
} else if (isFirebaseDataSnapshot(item)) {
6573
return cases.snapshotCase!();
66-
} else if (utils.isAFUnwrappedSnapshot(item)) {
67-
return cases.unwrappedSnapshotCase!()
6874
}
69-
throw new Error(`Method requires a key, snapshot, reference, or unwrapped snapshot. Got: ${typeof item}`);
70-
}
75+
throw new Error(`Method requires a key, snapshot, reference. Got: ${typeof item}`);
76+
}

0 commit comments

Comments
 (0)