Passed
Push — master ( cf6673...dc03f9 )
by Miloš
03:30
created

AuthStorageProvider.getUser   A

Complexity

Conditions 2

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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