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

src/storage/storage-provider.ts   A

Complexity

Total Complexity 6
Complexity/F 2

Size

Lines of Code 64
Function Count 3

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 48
mnd 3
bc 3
fnc 3
dl 0
loc 64
rs 10
bpm 1
cpm 2
noi 0
c 0
b 0
f 0

3 Functions

Rating   Name   Duplication   Size   Complexity  
A StorageProvider.getUser 0 13 2
A StorageProvider.getProvider 0 3 1
A StorageProvider.getProviderById 0 20 3
1
import { Injectable } from '@angular/core';
2
import { Cacheable } from 'ngx-cacheable';
3
import { from, Observable } from 'rxjs';
4
import { UserModel } from '..';
5
import { FirebaseStorage } from './firebase-storage';
6
import { IStorageProvider } from './i-storage-provider';
7
import { IStorageProviderOptions } from './i-storage-provider-options';
8
import { InMemoryStorage } from './in-memory-storage.service';
9
10
@Injectable({
11
    providedIn: 'root',
12
})
13
export class StorageProvider<User extends UserModel = UserModel> {
14
    options: IStorageProviderOptions = {
15
        userTable: 'users',
16
        storage: false,
17
    }
18
19
    public constructor(
20
        private firebaseStorage: FirebaseStorage<User>,
21
        private inMemoryStorage: InMemoryStorage
22
    ) {
23
    }
24
25
    /**
26
     * Get user from cache if possible or from a storage
27
     */
28
    @Cacheable()
29
    public getUser(): Observable<User | unknown | null> {
30
        const storageProvider = this.getProvider();
31
32
        if (storageProvider !== null) {
33
            return from(storageProvider.fetchUser());
34
        }
35
36
        throw new Error('No storage provider found.');
37
    }
38
39
    public getProvider() {
40
        return this.getProviderById(this.options.storage);
41
    }
42
43
    protected getProviderById(
44
        providerId: false | 'firestore',
45
    ): IStorageProvider<User> {
46
        let provider;
47
        switch (providerId) {
48
            case 'firestore':
49
                provider = this.firebaseStorage;
50
                provider.options.userTable = this.options.userTable;
51
                break;
52
            case false:
53
                provider = this.inMemoryStorage;
54
                break;
55
        }
56
57
        if (provider !== undefined) {
58
            return provider;
59
        }
60
61
        throw new Error(`Provider ${providerId} not supported.`);
62
    }
63
}
64