Project

General

Profile

1
import {Injectable} from '@angular/core';
2
import {HttpClient} from '@angular/common/http';
3
import {BehaviorSubject, Observable, of} from "rxjs";
4
import {COOKIE, User} from "../login/utils/helper.class";
5
import {catchError, map, timeout} from "rxjs/operators";
6
import {NavigationEnd, Router} from "@angular/router";
7

    
8
@Injectable({
9
  providedIn: 'root'
10
})
11
export class UserManagementService {
12
  
13
  private getUserInfoSubject: BehaviorSubject<User> = new BehaviorSubject<User>(null);
14
  private lock: boolean = false;
15
  
16
  constructor(private http: HttpClient,
17
              private router: Router) {
18
    this.router.events.subscribe(event => {
19
      if (event instanceof NavigationEnd) {
20
        const token = COOKIE.getCookie('AccessToken');
21
        if (!token && this.getUserInfoSubject.getValue() !== null) {
22
          this.getUserInfoSubject.next(null);
23
        }
24
      }
25
    })
26
  }
27
  
28
  public getUserInfo(url: string): Observable<User> {
29
    const token = COOKIE.getCookie('AccessToken');
30
    if (!token) {
31
      this.getUserInfoSubject.next(null);
32
    } else {
33
      if (this.getUserInfoSubject.getValue() === null && !this.lock) {
34
        this.lock = true;
35
        this.http.get<User>(url + token).pipe(map(userInfo => {
36
          return this.parseUserInfo(userInfo);
37
        })).pipe(timeout(3000), catchError(() => {
38
          return of(null);
39
        })).subscribe(user => {
40
          if (this.getUserInfoSubject.getValue() === null) {
41
            this.getUserInfoSubject.next(user);
42
            this.lock = false;
43
          }
44
        });
45
      }
46
    }
47
    return this.getUserInfoSubject.asObservable();
48
  }
49
  
50
  private parseUserInfo(info: any) {
51
    const user: User = new User();
52
    user.id = (info.sub && info.sub.indexOf('@')) ? info.sub.substring(0, info.sub.indexOf('@')) : info.sub;
53
    
54
    user.firstname = (info.given_name) ? info.given_name : "";
55
    user.lastname = (info.family_name) ? info.family_name : "";
56
    user.email = info.email;
57
    user.fullname = (info.name) ? info.name : "";
58
    if (user.fullname == "") {
59
      if (user.firstname != "") {
60
        user.fullname += user.firstname;
61
      }
62
      if (user.lastname != "") {
63
        user.fullname += user.lastname;
64
      }
65
      if (user.fullname == "") { //fullname is still empty set a default
66
        user.fullname = "Anonymous user";
67
      }
68
    }
69
    if (info.edu_person_entitlements) {
70
      user.role = info.edu_person_entitlements;
71
    } else {
72
      user.role = [];
73
    }
74
    user.expirationDate = info.exp;
75
    return user;
76
  }
77
}
(20-20/21)