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

AbstractStorage.subscribeUser   A

Complexity

Conditions 2

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 12
rs 9.9
c 0
b 0
f 0
cc 2
1
import { AngularFireAuth } from "@angular/fire/auth";
2
import * as firebase from "firebase";
3
import { Observable, of } from "rxjs";
4
import { switchMap } from "rxjs/operators";
5
import { UniFirebaseLoginConfig } from "../config/uni-firebase-login-config";
6
import { UniFirebaseLoginConfigProvider } from "../config/uni-firebase-login-config-provider";
7
import { UserModel } from "../model/user-model";
8
import { IStorageProvider } from "./i-storage-provider";
9
10
export abstract class AbstractStorage<User extends UserModel = UserModel>
11
    implements IStorageProvider<User> {
12
    protected config: UniFirebaseLoginConfig;
13
14
    protected constructor(
15
        protected angularFireAuth: AngularFireAuth,
16
        configProvider: UniFirebaseLoginConfigProvider,
17
    ) {
18
        this.config = configProvider.config;
19
    }
20
21
    public abstract async updateStoredDataByUser(user: User): Promise<void>;
22
23
    public abstract async updateStoredDataByFirebaseUser(
24
        firebaseUser: firebase.User,
25
    ): Promise<void>;
26
27
    public async fetchUser(): Promise<User | null> {
28
        return this.subscribeUser().toPromise();
29
    }
30
31
    public subscribeUser(): Observable<User | null> {
32
        // Get the auth state, then fetch the Firestore user document or return null
33
        return this.angularFireAuth.authState.pipe(
34
            switchMap((user: any) => {
35
                if (user) {
36
                    this.fetchUserFromStorageByFirebaseUser(user);
37
                }
38
                // Logged out
39
                return of(null);
40
            }),
41
        ) as Observable<User | null>;
42
    }
43
44
    protected abstract fetchUserFromStorageByFirebaseUser(
45
        user: User,
46
    ): Observable<User | null>;
47
48
    /**
49
     * Override this method if you want to use custom model class
50
     */
51
    protected getNewUser(): User {
52
        return this.config.userFactoryFunc() as User;
53
    }
54
}
55