Passed
Push — master ( 08bf3f...eee322 )
by Miloš
03:10
created

src/storage/firestore-storage.ts   A

Complexity

Total Complexity 7
Complexity/F 1.75

Size

Lines of Code 100
Function Count 4

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 76
mnd 3
bc 3
fnc 4
dl 0
loc 100
rs 10
bpm 0.75
cpm 1.75
noi 0
c 0
b 0
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
A FirestoreStorage.updateStoredDataByFirebaseUser 0 16 2
A FirestoreStorage.updateStoredDataByUser 0 14 2
A FirestoreStorage.fetchUserFromStorageByFirebaseUser 0 23 1
A FirestoreStorage.getUserRef 0 11 2
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 * as firebase 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 { StorageUserModel } from "../model/storage-user-model";
12
import { UserModel } from "../model/user-model";
13
import { AbstractStorage } from "./abstract-storage";
14
import { IStorageProvider } from "./i-storage-provider";
15
16
@Injectable({
17
    providedIn: "root",
18
})
19
export class FirestoreStorage<User extends UserModel = UserModel>
20
    extends AbstractStorage<User>
21
    implements IStorageProvider<User> {
22
    public constructor(
23
        protected angularFirestore: AngularFirestore,
24
        angularFireAuth: AngularFireAuth,
25
        configProvider: UniFirebaseLoginConfigProvider,
26
    ) {
27
        super(angularFireAuth, configProvider);
28
    }
29
30
    public async updateStoredDataByUser(user: User): Promise<void> {
31
        if (user.uid) {
32
            const userRef = this.getUserRef(user.uid);
33
34
            const data = this.config.storageUserFactoryFunc(
35
                this.config.mapUserToStorageFunc(user),
36
            );
37
38
            await userRef.set(JSON.parse(JSON.stringify(data)), {
39
                merge: true,
40
            });
41
        } else {
42
            throw new Error("Firebase user has no UID.");
43
        }
44
    }
45
46
    public getUserRef(
47
        userUid: string,
48
    ): AngularFirestoreDocument<StorageUserModel> {
49
        if (this.config.storageUserTable === null) {
50
            throw new Error("userTable is not specified!");
51
        }
52
53
        return this.angularFirestore
54
            .collection(this.config.storageUserTable)
55
            .doc(userUid);
56
    }
57
58
    public async updateStoredDataByFirebaseUser(
59
        firebaseUser: firebase.User,
60
    ): Promise<void> {
61
        if (firebaseUser.uid) {
62
            const userRef = this.getUserRef(firebaseUser.uid);
63
64
            const data = this.config.storageUserFactoryFunc(
65
                this.config.mapFirebaseUserToStorageFunc(firebaseUser),
66
            );
67
68
            await userRef.set(JSON.parse(JSON.stringify(data)), {
69
                merge: true,
70
            });
71
        } else {
72
            throw new Error("Firebase user has no UID.");
73
        }
74
    }
75
76
    protected fetchUserFromStorageByFirebaseUser(
77
        user: User,
78
    ): Observable<User | null> {
79
        // User is logged in
80
        return this.angularFirestore
81
            .doc<StorageUserModel>(
82
                `${this.config.storageUserTable}/${user.uid}`,
83
            )
84
            .valueChanges()
85
            .pipe(
86
                switchMap((userFirebase: any) => {
87
                    return new Observable(subscriber => {
88
                        subscriber.next(
89
                            Object.assign<User, any>(
90
                                this.getNewUser(),
91
                                userFirebase,
92
                            ),
93
                        );
94
                        subscriber.complete();
95
                    });
96
                }),
97
            ) as Observable<User>;
98
    }
99
}
100