Passed
Push — master ( 67261f...67f253 )
by Miloš
02:58
created

subscribeUserDataFromStorageByFirebaseUser   A

Complexity

Conditions 1

Size

Total Lines 21
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 14
dl 0
loc 21
rs 9.7
c 0
b 0
f 0
cc 1
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 { switchMap } 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<UserModel> {
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(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
        // User is logged in
71
        return this.angularFirestore
72
            .doc<UserModel>(`${this.config.storageUserTable}/${user.uid}`)
73
            .valueChanges()
74
            .pipe(
75
                switchMap((userFirebase: any) => {
76
                    return new Observable(subscriber => {
77
                        subscriber.next(
78
                            Object.assign<User, any>(
79
                                this.getNewUser(),
80
                                userFirebase,
81
                            ),
82
                        );
83
                        subscriber.complete();
84
                    });
85
                }),
86
            ) as Observable<User>;
87
    }
88
}
89