1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
import { catchError, map, take } from 'rxjs/operators';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import { BehaviorSubject, Observable, of, Subject, throwError } from 'rxjs';
// Models
import { UserAccount } from '../_interface/UserAccount.interface';
import { Navigation } from '../_interface/Navigation.interface';
@Injectable({providedIn: 'root'})
export class AuthService {
public isloggedIn : boolean = false;
public user : UserAccount;
public navigations : Navigation [] = [];
private error : string = '';
public errorMessage: string ='';
private currentUserSubject = new BehaviorSubject<UserAccount>({} as UserAccount);
public currentUser$: Observable<UserAccount>;
constructor( private http: HttpClient) {
this.currentUser$ = this.currentUserSubject.asObservable();
}
// récupère directement la valeur contenu dans le sujet
public get currentUserValue(): UserAccount {
return this.currentUserSubject.getValue();
}
// currentUserSubject est private donc il faut une fonction pour le retourner à qui le demande
getCurrentUserSubject(): BehaviorSubject<UserAccount> {
return this.currentUserSubject;
}
// la partie Observable de currentUserSubject
getCurrentUserObs(): Observable<UserAccount> {
return this.currentUser$;
}
LogIn(login: string, password : string): Observable<UserAccount>{
let apiUserAccount: string = environment.apiAddress + 'UserAccount/' + 'Login?' + 'login=' + login + '&' + 'password=' + password;
return this.http.get<UserAccount>(apiUserAccount);
}
getNavigation(accountTypeId: number) : Observable<Navigation[]> {
let apiNavigation: string = environment.apiAddress + 'NavigationByUser/' + accountTypeId;
return this.http.get<Navigation[]>(apiNavigation);
}
logout() {
const user = {} as UserAccount; // un currentUser vide
this.updateAndEmitCurrentUser(user); // on enregistre et informe qu'une déconnexion à eu lieu
}
isLogged(): Observable<boolean> {
return this.currentUser$.pipe(
map((user: UserAccount) => <boolean>user.isLogged), // la valeur qui doit être retourné est : isLogged, les autres ne nous intéressent pas
take(1)
);
}
updateCurrentUser(user: UserAccount) {
this.updateAndEmitCurrentUser(user);
}
updateAndEmitCurrentUser(user: UserAccount) {
localStorage.setItem("currentUser", JSON.stringify(user)); // on enregistre dans une petite base de donnée du navigateur.
// on ne l'utilise pas mais je le laisse pour l'exemple au cas ou
this.currentUserSubject.next(user); // on informe tous les souscripteurs d'un nouvel état de : ICurrentUser
}
// Error
handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// client-side error
console.log('client-side error')
return throwError(error.error.message);
}
// server-side error
console.log('server-side error')
return throwError(error);
}
} |