Skip to content

Commit e9798bd

Browse files
committed
adding redirections
1 parent 8c62bbb commit e9798bd

File tree

12 files changed

+162
-16
lines changed

12 files changed

+162
-16
lines changed

src/app/app.routes.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { UserConnectionComponent } from './feature/user/components/user-connecti
55
//import { isLoggedInGuard } from './core/guards/is-logged-in.guard';
66
import { isAdminGuard } from './core/guards/is-admin.guard';
77
import { CreateUserComponent } from './feature/user/components/create-user/create-user.component';
8+
import { isProviderGuard } from './core/guards/is-provider.guard';
9+
import { ProviderHomeComponent } from './feature/provider/page/provider-home/provider-home.component';
810

911
export const routes: Routes = [
1012
{
@@ -24,9 +26,17 @@ export const routes: Routes = [
2426
},
2527
{
2628
path: 'contact',
27-
component: UserConnectionComponent,
29+
component: CreateUserComponent,
30+
},
31+
{ path: 'auth', component: UserConnectionComponent },
32+
33+
{
34+
path: 'providers',
35+
component: ProviderHomeComponent,
36+
37+
canActivate: [isProviderGuard],
38+
//canActivate: [isLoggedInGuard],
2839
},
29-
{ path: 'signup', component: CreateUserComponent },
3040

3141
// {
3242
// // path: '**',

src/app/core/components/header/header.component.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
<a [routerLink]="'/contact'" class="nav-link">Contact</a>
1111
</nav>
1212

13-
<button class="header-button" type="button" (click)="navigateToSignUpPage()">Se connecter / s'inscrire</button>
14-
13+
<!-- <button class="header-button" type="button" (click)="navigateToSignUpPage()">Se connecter / s'inscrire</button>// -->
14+
<button *ngIf="isLoggedIn" type="button" (click)="onLogout()">Déconnexion</button>
15+
<button *ngIf="!isLoggedIn" type="button" class="header-button" (click)="navigateToSignUpPage()">Se connecter / s'inscrire</button>
1516
<button class="btn btn-light d-md-none" type="button" data-bs-toggle="collapse" data-bs-target="#mobileMenu"></button>
1617
</div>
1718

@@ -24,7 +25,5 @@
2425
</nav>
2526
</div>
2627

27-
<button *ngIf="isLoggedIn" type="button" (click)="onLogout()">Déconnexion</button>
28-
<button *ngIf="!isLoggedIn" type="button" class="btn btn-primary mt-2" (click)="navigateToSignUpPage()">Se connecter / s'inscrire</button>
2928

3029
</header>

src/app/core/components/header/header.component.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,17 @@ export class HeaderComponent implements OnInit {
2727
// this._authService.logoutMessage$.subscribe((msg) => {
2828
// if (msg) {
2929
// this.message = msg;
30-
30+
3131
// // Efface le message après quelques secondes
3232
// setTimeout(() => {
3333
// this.message = null;
3434
// }, 3000);
3535
// }
3636
// });
37-
38-
3937
}
4038

4139
navigateToSignUpPage(): void {
42-
this._router.navigate(['/signup']);
40+
this._router.navigate(['/auth']);
4341
}
4442
onLogout(): void {
4543
this._authService.logout();
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { TestBed } from '@angular/core/testing';
2+
import { CanActivateFn } from '@angular/router';
3+
4+
import { isProviderGuard } from './is-provider.guard';
5+
6+
describe('isProviderGuard', () => {
7+
const executeGuard: CanActivateFn = (...guardParameters) =>
8+
TestBed.runInInjectionContext(() => isProviderGuard(...guardParameters));
9+
10+
beforeEach(() => {
11+
TestBed.configureTestingModule({});
12+
});
13+
14+
it('should be created', () => {
15+
expect(executeGuard).toBeTruthy();
16+
});
17+
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { inject } from '@angular/core';
2+
import { CanActivateFn, Router, UrlTree } from '@angular/router';
3+
import { map, Observable, of, switchMap } from 'rxjs';
4+
import { AuthService } from '../services/auth.service';
5+
import { UserStoreService } from '../services/user-store.service';
6+
7+
export const isProviderGuard: CanActivateFn = (): Observable<boolean | UrlTree> => {
8+
const authService = inject(AuthService);
9+
console.log('authService', 'router', 'userStoreService');
10+
11+
const router = inject(Router);
12+
const userStoreService = inject(UserStoreService);
13+
14+
const rolesFromToken = authService.getRoleFromToken();
15+
16+
return userStoreService.getRolesFromStore().pipe(
17+
switchMap(roles => {
18+
console.log('Rôles récupérés du store:', roles);
19+
20+
if (rolesFromToken.includes('ROLE_PROVIDER')) {
21+
console.log("L'utilisateur est un provider");
22+
return authService.isLoggedInObservable().pipe(map(loggedIn => (loggedIn ? true : router.createUrlTree(['/auth']))));
23+
}
24+
25+
console.log("L'utilisateur n'est pas un provider");
26+
return of(router.createUrlTree(['/auth']));
27+
})
28+
);
29+
};

src/app/core/services/auth.service.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@ import { BehaviorSubject, map, Observable, of, tap } from 'rxjs';
44
import { TokenService } from './token.service';
55
import { JwtHelperService } from '@auth0/angular-jwt';
66
import { UserStoreService } from './user-store.service';
7+
import { Router } from '@angular/router';
78

89
type Role = {
910
authority: string;
1011
};
1112

12-
1313
@Injectable({
1414
providedIn: 'root',
1515
})
1616
export class AuthService {
1717
private _userPayload: any;
1818
private _authStatus$!: BehaviorSubject<boolean>;
1919
private _logoutMessage$ = new BehaviorSubject<string | null>(null);
20-
public logoutMessage$ = this._logoutMessage$.asObservable();
20+
public logoutMessage$ = this._logoutMessage$.asObservable();
2121

2222
constructor(
2323
private _http: HttpClient,
2424
private _tokenService: TokenService,
25-
private _userStore: UserStoreService
25+
private _userStore: UserStoreService,
26+
private _router: Router
2627
) {
27-
this._authStatus$ = new BehaviorSubject<boolean>(this._tokenService.isLogged());
28+
this._authStatus$ = new BehaviorSubject<boolean>(this._tokenService.isLogged());
2829
this._userPayload = this._decodeToken();
2930
console.log('User Payload après décode :', this._userPayload);
3031
}
31-
3232

3333
public register$(email: string, password: string): Observable<boolean> {
3434
return this._http.post<boolean>('http://localhost:8080/auth/register', { email, password });
@@ -57,6 +57,15 @@ public logoutMessage$ = this._logoutMessage$.asObservable();
5757
this._authStatus$.next(true);
5858

5959
console.log('les roles');
60+
const roles = this.getRoleFromToken();
61+
62+
if (roles.includes('ROLE_PROVIDER')) {
63+
this._router.navigate(['/providers']);
64+
} else if (roles.includes('ROLE_ADMIN')) {
65+
this._router.navigate(['/products']);
66+
} else {
67+
this._router.navigate(['/']);
68+
}
6069
}),
6170
map(res => res.token)
6271
);
@@ -87,7 +96,7 @@ public logoutMessage$ = this._logoutMessage$.asObservable();
8796
this._tokenService.clearToken();
8897
this._userPayload = null;
8998
this._authStatus$.next(false);
90-
this._logoutMessage$.next('Vous avez été déconnecté(e).')
99+
this._logoutMessage$.next('Vous avez été déconnecté(e).');
91100
}
92101

93102
private _decodeToken(): unknown {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { LoginService } from './login.service';
4+
5+
describe('LoginService', () => {
6+
let service: LoginService;
7+
8+
beforeEach(() => {
9+
TestBed.configureTestingModule({});
10+
service = TestBed.inject(LoginService);
11+
});
12+
13+
it('should be created', () => {
14+
expect(service).toBeTruthy();
15+
});
16+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Injectable } from '@angular/core';
2+
import { AuthService } from './auth.service';
3+
import { Router } from '@angular/router';
4+
5+
@Injectable({
6+
providedIn: 'root'
7+
})
8+
export class LoginService {
9+
constructor(private _authService: AuthService, private _router: Router) {}
10+
11+
onLogin(email: string, password: string): void {
12+
this._authService.login$(email, password).subscribe({
13+
next: () => {
14+
const roles = this._authService.getRoleFromToken();
15+
console.log('Rôles après login :', roles);
16+
17+
if (roles.includes('ROLE_PROVIDER')) {
18+
this._router.navigate(['/providers']);
19+
} else if (roles.includes('ROLE_USER')) {
20+
this._router.navigate(['/products']);
21+
} else {
22+
this._router.navigate(['/']);
23+
}
24+
},
25+
error: err => {
26+
console.error('Erreur de login', err);
27+
}
28+
});
29+
}
30+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<p>provider-home works!</p>
2+
<app-banner-home></app-banner-home>

src/app/feature/provider/page/provider-home/provider-home.component.scss

Whitespace-only changes.

0 commit comments

Comments
 (0)