Passed
Push — master ( dc03f9...e0c6dc )
by Miloš
03:58
created

src/guards/auth-guard.ts   A

Complexity

Total Complexity 3
Complexity/F 1.5

Size

Lines of Code 56
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 44
mnd 1
bc 1
fnc 2
dl 0
loc 56
rs 10
bpm 0.5
cpm 1.5
noi 0
c 0
b 0
f 0

2 Functions

Rating   Name   Duplication   Size   Complexity  
A AuthGuard.canActivate 0 19 2
A AuthGuard.canActivateChild 0 6 1
1
import { Injectable } from "@angular/core";
2
import {
3
    ActivatedRouteSnapshot,
4
    CanActivate,
5
    CanActivateChild,
6
    Router,
7
    RouterStateSnapshot,
8
} from "@angular/router";
9
import { map, take, tap } from "rxjs/operators";
10
import { UniFirebaseLoginConfig } from "../config/uni-firebase-login-config";
11
import { UserModel } from "../model/user-model";
12
import { BaseAuthService } from "../services/base-auth-service";
13
14
@Injectable({
15
    providedIn: "root",
16
})
17
export class AuthGuard<User extends UserModel = UserModel>
18
    implements CanActivate, CanActivateChild {
19
    public constructor(
20
        protected auth: BaseAuthService<User>,
21
        protected router: Router,
22
        protected config: UniFirebaseLoginConfig,
23
    ) {}
24
25
    public async canActivate(
26
        next: ActivatedRouteSnapshot,
27
        state: RouterStateSnapshot,
28
    ): Promise<boolean> {
29
        const user$ = this.auth.getUser();
30
31
        return user$
32
            .pipe(
33
                take(1),
34
                map(user => !!user), // Map to boolean
35
                tap(loggedIn => {
36
                    if (!loggedIn) {
37
                        // Access denied
38
                        const redirectTo = this.config.signInPage;
39
                        console.log(
40
                            `Insufficient permissions, redirecting to: ${redirectTo}`,
41
                        );
42
                        return this.router.navigate([redirectTo]);
43
                    }
44
                }),
45
            )
46
            .toPromise();
47
    }
48
49
    public canActivateChild(
50
        next: ActivatedRouteSnapshot,
51
        state: RouterStateSnapshot,
52
    ): Promise<boolean> {
53
        return this.canActivate(next, state);
54
    }
55
}
56