add initial Angular components, services, and routing setup

This commit is contained in:
Vincent Guillet
2025-09-24 11:31:28 +02:00
parent dfb4ac302a
commit 18f0364e26
64 changed files with 15879 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
import { TestBed } from '@angular/core/testing';
import { CanActivateFn } from '@angular/router';
import { adminOnlyGuard } from './admin-only.guard';
describe('adminOnlyGuard', () => {
const executeGuard: CanActivateFn = (...guardParameters) =>
TestBed.runInInjectionContext(() => adminOnlyGuard(...guardParameters));
beforeEach(() => {
TestBed.configureTestingModule({});
});
it('should be created', () => {
expect(executeGuard).toBeTruthy();
});
});

View File

@@ -0,0 +1,27 @@
import { inject } from '@angular/core';
import { CanActivateFn, CanMatchFn, Router, UrlTree, ActivatedRouteSnapshot, Route } from '@angular/router';
import { AuthService } from '../../services/auth/auth.service';
function requireAdmin(url?: string): boolean | UrlTree {
const authService: AuthService = inject(AuthService);
const router: Router = inject(Router);
// 1) pas connecté -> envoie vers /login (avec redirect)
if (!authService.isLoggedIn()) {
return router.createUrlTree(['/login'], { queryParams: { redirect: url ?? router.url } });
}
// 2) connecté mais pas ADMIN -> redirige vers /home (ou /403 si tu crées une page)
if (!authService.hasRole('Administrator')) {
return router.parseUrl('/home');
}
// 3) ok
return true;
}
export const adminOnlyCanActivate: CanActivateFn = (route: ActivatedRouteSnapshot): boolean | UrlTree =>
requireAdmin(route?.url?.map(u => u.path).join('/') ?? '/admin');
export const adminOnlyCanMatch: CanMatchFn = (route: Route): boolean | UrlTree =>
requireAdmin(route?.path ?? '/admin');

View File

@@ -0,0 +1,17 @@
import { TestBed } from '@angular/core/testing';
import { CanMatchFn } from '@angular/router';
import { authOnlyGuard } from './auth-only.guard';
describe('authOnlyGuard', () => {
const executeGuard: CanMatchFn = (...guardParameters) =>
TestBed.runInInjectionContext(() => authOnlyGuard(...guardParameters));
beforeEach(() => {
TestBed.configureTestingModule({});
});
it('should be created', () => {
expect(executeGuard).toBeTruthy();
});
});

View File

@@ -0,0 +1,21 @@
import { inject } from '@angular/core';
import { CanActivateFn, CanMatchFn, Router, UrlTree, ActivatedRouteSnapshot, Route } from '@angular/router';
import { AuthService } from '../../services/auth/auth.service';
function requireAuth(url?: string): boolean | UrlTree {
const authService = inject(AuthService);
const router = inject(Router);
if (authService.isLoggedIn()) {
return true;
}
// redirige vers /login avec un param "redirect"
return router.createUrlTree(['/login'], { queryParams: { redirect: url ?? router.url } });
}
export const authOnlyCanActivate: CanActivateFn = (route: ActivatedRouteSnapshot): boolean | UrlTree =>
requireAuth(route?.url?.map(urlSegment => urlSegment.path).join('/') ?? '/login');
export const authOnlyCanMatch: CanMatchFn = (route: Route): boolean | UrlTree =>
requireAuth(route?.path ?? '/login');

View File

@@ -0,0 +1,17 @@
import { TestBed } from '@angular/core/testing';
import { CanMatchFn } from '@angular/router';
import { guestOnlyGuard } from './guest-only.guard';
describe('guestOnlyGuard', () => {
const executeGuard: CanMatchFn = (...guardParameters) =>
TestBed.runInInjectionContext(() => guestOnlyGuard(...guardParameters));
beforeEach(() => {
TestBed.configureTestingModule({});
});
it('should be created', () => {
expect(executeGuard).toBeTruthy();
});
});

View File

@@ -0,0 +1,13 @@
import { inject } from '@angular/core';
import { Router, UrlTree, CanActivateFn, CanMatchFn } from '@angular/router';
import { AuthService } from '../../services/auth/auth.service';
function redirectIfLoggedIn(): boolean | UrlTree {
const authService = inject(AuthService);
const router = inject(Router);
// Si déjà connecté -> redirige vers /home
return authService.isLoggedIn() ? router.parseUrl('/home') : true;
}
export const guestOnlyCanMatch: CanMatchFn = () => redirectIfLoggedIn();
export const guestOnlyCanActivate: CanActivateFn = () => redirectIfLoggedIn();