Passed
Push — master ( 0543ef...cf6673 )
by Miloš
02:59
created

src/storage/in-memory-storage.service.ts   A

Complexity

Total Complexity 7
Complexity/F 1.4

Size

Lines of Code 54
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 42
mnd 2
bc 2
fnc 5
dl 0
loc 54
rs 10
bpm 0.4
cpm 1.4
noi 0
c 0
b 0
f 0

5 Functions

Rating   Name   Duplication   Size   Complexity  
A InMemoryStorage.onUserDataChanged 0 4 2
A InMemoryStorage.updateStoredDataByFirebaseUser 0 15 2
A InMemoryStorage.fetchUser 0 3 1
A InMemoryStorage.updateStoredDataByUser 0 4 1
A InMemoryStorage.subscribeUser 0 5 1
1
import { Injectable } from '@angular/core';
2
import * as firebase from 'firebase';
3
import { Observable, Subscriber } from 'rxjs';
4
import { FirebaseUserModel, UserModel } from '..';
5
import { IStorageProvider } from './i-storage-provider';
6
7
@Injectable({
8
    providedIn: 'root',
9
})
10
export class InMemoryStorage<User extends UserModel = UserModel>
11
    implements IStorageProvider<User> {
12
    private userData: any;
13
    private subscribers: Subscriber<unknown>[] = [];
14
15
    public async updateStoredDataByUser(user: User): Promise<void> {
16
        this.userData = user;
17
        this.onUserDataChanged();
18
    }
19
20
    public updateStoredDataByFirebaseUser(firebaseUser: firebase.User): Promise<void> {
21
        if (firebaseUser.uid) {
22
            const data = new FirebaseUserModel({
23
                displayName: firebaseUser.displayName,
24
                email: firebaseUser.email,
25
                photoURL: firebaseUser.photoURL,
26
                uid: firebaseUser.uid,
27
            });
28
29
            Object.assign(this.userData, data);
30
31
            return new Promise(resolve => resolve());
32
        } else {
33
            throw new Error('Firebase user has no UID.');
34
        }
35
    }
36
37
    private onUserDataChanged() {
38
        for (const subscriber of this.subscribers) {
39
            subscriber.next(this.userData);
40
        }
41
    }
42
43
    public fetchUser(): Promise<User | unknown | null> {
44
        return this.subscribeUser().toPromise();
45
    }
46
47
    public subscribeUser(): Observable<User | unknown | null> {
48
        return new Observable(subscriber => {
49
            this.subscribers.push(subscriber);
50
            subscriber.next(this.userData);
51
        });
52
    }
53
}
54