Passed
Pull Request — master (#132)
by
unknown
04:20
created

src/storage/firestore-storage.ts   A

Complexity

Total Complexity 7
Complexity/F 1.75

Size

Lines of Code 79
Function Count 4

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 62
mnd 3
bc 3
fnc 4
dl 0
loc 79
rs 10
bpm 0.75
cpm 1.75
noi 0
c 0
b 0
f 0
1
import { Injectable } from "@angular/core";
2
import { AngularFireAuth } from "@angular/fire/auth";
3
import {
4
  AngularFirestore,
5
  AngularFirestoreDocument,
6
} from "@angular/fire/firestore";
7
import { User as FirebaseUser } from "firebase";
8
import { Observable } from "rxjs";
9
import { map } from "rxjs/operators";
10
import { UniFirebaseLoginConfigProvider } from "../config/uni-firebase-login-config-provider";
11
import { UserModel } from "../model/user-model";
12
import { AbstractStorage } from "./abstract-storage";
13
import { IStorageProvider } from "./i-storage-provider";
14
15
@Injectable({
16
  providedIn: "root",
17
})
18
export class FirestoreStorage<User extends UserModel = UserModel>
19
  extends AbstractStorage<User>
20
  implements IStorageProvider<User> {
21
  public constructor(
22
    protected angularFirestore: AngularFirestore,
23
    angularFireAuth: AngularFireAuth,
24
    configProvider: UniFirebaseLoginConfigProvider,
25
  ) {
26
    super(angularFireAuth, configProvider);
27
  }
28
29
  public async updateStoredDataByUser(user: User): Promise<void> {
30
    if (user.uid) {
31
      const userRef = this.getUserRef(user.uid);
32
33
      await userRef.set(JSON.parse(JSON.stringify(user)), {
34
        merge: true,
35
      });
36
    } else {
37
      throw new Error("Firebase user has no UID.");
38
    }
39
  }
40
41
  public getUserRef(userUid: string): AngularFirestoreDocument<User> {
42
    if (this.config.storageUserTable === null) {
43
      throw new Error("userTable is not specified!");
44
    }
45
46
    return this.angularFirestore
47
      .collection(this.config.storageUserTable)
48
      .doc<User>(userUid);
49
  }
50
51
  public async updateStoredDataByFirebaseUser(
52
    firebaseUser: FirebaseUser,
53
  ): Promise<void> {
54
    if (firebaseUser.uid) {
55
      const userRef = this.getUserRef(firebaseUser.uid);
56
57
      const data = this.config.mapFirebaseUserToStorageFunc(firebaseUser);
58
59
      await userRef.set(JSON.parse(JSON.stringify(data)), {
60
        merge: true,
61
      });
62
    } else {
63
      throw new Error("Firebase user has no UID.");
64
    }
65
  }
66
67
  public subscribeUserDataFromStorageByFirebaseUser(
68
    user: FirebaseUser,
69
  ): Observable<User | null> {
70
    return this.getUserRef(user.uid)
71
      .valueChanges()
72
      .pipe(
73
        map((userFirebase: any) => {
74
          return Object.assign<User, any>(this.getNewUser(), userFirebase);
75
        }),
76
      ) as Observable<User>;
77
  }
78
}
79