Passed
Push — master ( 57ea89...92a34c )
by Miloš
03:10
created

AuthGuard.handleAccessDeniedRedirect   A

Complexity

Conditions 3

Size

Total Lines 19
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 19
rs 9.55
c 0
b 0
f 0
cc 3
1
import { Injectable } from "@angular/core";
2
import {
3
    ActivatedRoute,
4
    ActivatedRouteSnapshot,
5
    CanActivate,
6
    CanActivateChild,
7
    NavigationExtras,
8
    Router,
9
    RouterStateSnapshot,
10
} from "@angular/router";
11
import { Observable } from "rxjs";
12
import { UniFirebaseLoginConfig } from "../config/uni-firebase-login-config";
13
import { UniFirebaseLoginConfigProvider } from "../config/uni-firebase-login-config-provider";
14
import { UserModel } from "../model/user-model";
15
import { BaseAuthService } from "../services/base-auth-service";
16
import { IGuard } from "./i-guard";
17
18
@Injectable({
19
    providedIn: "root",
20
})
21
export class AuthGuard<User extends UserModel = UserModel>
22
    implements CanActivate, CanActivateChild, IGuard<User> {
23
    protected config: UniFirebaseLoginConfig;
24
25
    public constructor(
26
        protected auth: BaseAuthService<User>,
27
        protected route: ActivatedRoute,
28
        protected router: Router,
29
        configProvider: UniFirebaseLoginConfigProvider,
30
    ) {
31
        this.config = configProvider.config;
32
    }
33
34
    public canActivate(
35
        route: ActivatedRouteSnapshot,
36
        state: RouterStateSnapshot,
37
    ): Observable<boolean> {
38
        return new Observable(subscriber => {
39
            this.auth.userInitialized$.subscribe(initialized => {
40
                if (initialized) {
41
                    this.auth.user$.subscribe(user => {
42
                        const isLoggedIn = !!user;
43
                        if (!isLoggedIn) {
44
                            this.handleAccessDeniedRedirect(route, state).then(() => {
45
                                subscriber.next(false);
46
                                subscriber.complete();
47
                            });
48
                        } else {
49
                            subscriber.next(true);
50
                            subscriber.complete();
51
                        }
52
                    });
53
                }
54
            });
55
        });
56
    }
57
58
    public canActivateChild(
59
        next: ActivatedRouteSnapshot,
60
        state: RouterStateSnapshot,
61
    ): Observable<boolean> {
62
        return this.canActivate(next, state);
63
    }
64
65
    public async handleAccessDeniedRedirect(
66
        route: ActivatedRouteSnapshot,
67
        state: RouterStateSnapshot,
68
    ): Promise<void> {
69
        console.log(`Access denied (AuthGuard): ${state.url}`);
70
71
        const redirectTo = this.config.signInPage;
72
73
        console.log(`Redirect: ${redirectTo}`);
74
75
        if (redirectTo) {
76
            let routerExtras: NavigationExtras | undefined;
77
            if (this.config.redirectBack) {
78
                routerExtras = {
79
                    queryParams: {redirectBack: state.url}
80
                }
81
            }
82
            await this.router.navigate([redirectTo], routerExtras);
83
        }
84
    }
85
}
86