From 9452732730c29a38a71eea2d0483f515340a58c3 Mon Sep 17 00:00:00 2001 From: Nathalie Eugler Date: Mon, 16 Mar 2026 17:43:26 +0100 Subject: [PATCH] add guards admin-dashboard and user-dashboard components --- .idea/.idea.DotNetAngular/.idea/workspace.xml | 55 +++++++- src/ClientApp/src/app/app.config.ts | 7 +- src/ClientApp/src/app/app.routes.ts | 19 ++- src/ClientApp/src/app/domain/entities/user.ts | 5 - .../authentication/login/login.component.ts | 3 +- .../admin-dashboard.component.html | 10 ++ .../admin-dashboard.component.scss | 0 .../admin-dashboard.component.spec.ts | 23 ++++ .../admin-dashboard.component.ts | 15 +++ .../components/header/header.component.html | 19 +-- .../components/header/header.component.ts | 3 +- .../unauthorized/unauthorized.component.html | 1 + .../unauthorized/unauthorized.component.scss | 0 .../unauthorized.component.spec.ts | 23 ++++ .../unauthorized/unauthorized.component.ts | 11 ++ .../user-dashboard.component.html | 73 +++++++++++ .../user-dashboard.component.scss | 0 .../user-dashboard.component.spec.ts | 23 ++++ .../user-dashboard.component.ts | 38 ++++++ .../user-table/user-table.component.html | 98 ++++++++++++++ .../user-table/user-table.component.scss | 0 .../user-table/user-table.component.spec.ts | 23 ++++ .../user-table/user-table.component.ts | 120 ++++++++++++++++++ .../presentation/guards/admin.guard.spec.ts | 17 +++ .../app/presentation/guards/admin.guard.ts | 43 +++++++ .../guards/authentication.guard.spec.ts | 24 ++++ .../guards/authentication.guard.ts | 29 +++++ .../presentation/guards/guest.guard.spec.ts | 17 +++ .../app/presentation/guards/guest.guard.ts | 16 +++ .../interceptors/token.interceptor.spec.ts | 17 +++ .../interceptors/token.interceptor.ts | 75 +++++++++++ .../popup-modal/popup-modal.component.html | 19 +++ .../popup-modal/popup-modal.component.scss | 0 .../popup-modal/popup-modal.component.spec.ts | 23 ++++ .../popup-modal/popup-modal.component.ts | 26 ++++ 35 files changed, 837 insertions(+), 38 deletions(-) create mode 100644 src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.html create mode 100644 src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.scss create mode 100644 src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.spec.ts create mode 100644 src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.ts create mode 100644 src/ClientApp/src/app/presentation/components/unauthorized/unauthorized.component.html create mode 100644 src/ClientApp/src/app/presentation/components/unauthorized/unauthorized.component.scss create mode 100644 src/ClientApp/src/app/presentation/components/unauthorized/unauthorized.component.spec.ts create mode 100644 src/ClientApp/src/app/presentation/components/unauthorized/unauthorized.component.ts create mode 100644 src/ClientApp/src/app/presentation/components/user-dashboard/user-dashboard.component.html create mode 100644 src/ClientApp/src/app/presentation/components/user-dashboard/user-dashboard.component.scss create mode 100644 src/ClientApp/src/app/presentation/components/user-dashboard/user-dashboard.component.spec.ts create mode 100644 src/ClientApp/src/app/presentation/components/user-dashboard/user-dashboard.component.ts create mode 100644 src/ClientApp/src/app/presentation/components/user-table/user-table.component.html create mode 100644 src/ClientApp/src/app/presentation/components/user-table/user-table.component.scss create mode 100644 src/ClientApp/src/app/presentation/components/user-table/user-table.component.spec.ts create mode 100644 src/ClientApp/src/app/presentation/components/user-table/user-table.component.ts create mode 100644 src/ClientApp/src/app/presentation/guards/admin.guard.spec.ts create mode 100644 src/ClientApp/src/app/presentation/guards/admin.guard.ts create mode 100644 src/ClientApp/src/app/presentation/guards/authentication.guard.spec.ts create mode 100644 src/ClientApp/src/app/presentation/guards/authentication.guard.ts create mode 100644 src/ClientApp/src/app/presentation/guards/guest.guard.spec.ts create mode 100644 src/ClientApp/src/app/presentation/guards/guest.guard.ts create mode 100644 src/ClientApp/src/app/presentation/interceptors/token.interceptor.spec.ts create mode 100644 src/ClientApp/src/app/presentation/interceptors/token.interceptor.ts create mode 100644 src/ClientApp/src/app/presentation/shared/popup-modal/popup-modal.component.html create mode 100644 src/ClientApp/src/app/presentation/shared/popup-modal/popup-modal.component.scss create mode 100644 src/ClientApp/src/app/presentation/shared/popup-modal/popup-modal.component.spec.ts create mode 100644 src/ClientApp/src/app/presentation/shared/popup-modal/popup-modal.component.ts diff --git a/.idea/.idea.DotNetAngular/.idea/workspace.xml b/.idea/.idea.DotNetAngular/.idea/workspace.xml index 176ecf5..2f5cbdf 100644 --- a/.idea/.idea.DotNetAngular/.idea/workspace.xml +++ b/.idea/.idea.DotNetAngular/.idea/workspace.xml @@ -13,11 +13,41 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - @@ -322,7 +362,8 @@ - diff --git a/src/ClientApp/src/app/app.config.ts b/src/ClientApp/src/app/app.config.ts index a1e7d6f..87b4ef7 100644 --- a/src/ClientApp/src/app/app.config.ts +++ b/src/ClientApp/src/app/app.config.ts @@ -2,7 +2,12 @@ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; +import {provideHttpClient, withFetch, withInterceptors} from "@angular/common/http"; +import {tokenInterceptor} from "./presentation/interceptors/token.interceptor"; +import {provideClientHydration, withEventReplay} from "@angular/platform-browser"; export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] + providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), + provideHttpClient(withFetch(), withInterceptors([tokenInterceptor + ])), provideClientHydration(withEventReplay())] }; diff --git a/src/ClientApp/src/app/app.routes.ts b/src/ClientApp/src/app/app.routes.ts index b6cbab6..5fe5290 100644 --- a/src/ClientApp/src/app/app.routes.ts +++ b/src/ClientApp/src/app/app.routes.ts @@ -2,10 +2,21 @@ import { Routes } from '@angular/router'; import {RegisterComponent} from "./presentation/authentication/register/register.component"; import {LoginComponent} from "./presentation/authentication/login/login.component"; import {StartpageComponent} from "./presentation/components/startpage/startpage.component"; +import {AdminDashboardComponent} from "./presentation/components/admin-dashboard/admin-dashboard.component"; +import {UserDashboardComponent} from "./presentation/components/user-dashboard/user-dashboard.component"; +import {UnauthorizedComponent} from "./presentation/components/unauthorized/unauthorized.component"; +import {guestGuard} from "./presentation/guards/guest.guard"; +import {AuthenticationGuard} from "./presentation/guards/authentication.guard"; +import {adminGuard} from "./presentation/guards/admin.guard"; +import {UserTableComponent} from "./presentation/components/user-table/user-table.component"; export const routes: Routes = [ - {path: '', redirectTo: 'login', pathMatch: 'full'}, - {path: 'register', component: RegisterComponent}, - {path: 'login', component: LoginComponent}, - {path: 'startpage', component: StartpageComponent} + {path: '', redirectTo: 'startpage', pathMatch: 'full'}, + {path: 'register', component: RegisterComponent, canActivate: [guestGuard]}, + {path: 'login', component: LoginComponent, canActivate: [guestGuard]}, + {path: 'startpage', component: StartpageComponent, canActivate: [guestGuard]}, + {path: 'user-table', component: UserTableComponent, canActivate: [adminGuard]}, + {path: 'admin-dashboard', component: AdminDashboardComponent, canActivate: [adminGuard]}, + {path: 'user-dashboard', component: UserDashboardComponent, canActivate: [AuthenticationGuard]}, + {path: 'unauthorized', component: UnauthorizedComponent, canActivate: [AuthenticationGuard]} ]; diff --git a/src/ClientApp/src/app/domain/entities/user.ts b/src/ClientApp/src/app/domain/entities/user.ts index 330f3ff..dba0c2e 100644 --- a/src/ClientApp/src/app/domain/entities/user.ts +++ b/src/ClientApp/src/app/domain/entities/user.ts @@ -1,4 +1,3 @@ -import {RssFeed} from "./rss-feed"; import {UserRole} from "./user-role"; export interface User { @@ -8,9 +7,5 @@ export interface User { password: string; lastLogin: Date; - rssFeedId: number; - rssFeed: RssFeed; - UserRoles: UserRole[]; - rssFeeds: RssFeed []; } diff --git a/src/ClientApp/src/app/presentation/authentication/login/login.component.ts b/src/ClientApp/src/app/presentation/authentication/login/login.component.ts index b18df35..0feccf5 100644 --- a/src/ClientApp/src/app/presentation/authentication/login/login.component.ts +++ b/src/ClientApp/src/app/presentation/authentication/login/login.component.ts @@ -66,7 +66,8 @@ export class LoginComponent { this.userStore.setEmailForStore(tokenPayload.email); this.userStore.setRoleForStore(tokenPayload.role); this.loadingService.hide() - this.router.navigate(['startpage']).then(success => { + // TODO redirect to... + this.router.navigate(['user-dashboard']).then(success => { if (success) { this.loginForm.reset(); } diff --git a/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.html b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.html new file mode 100644 index 0000000..2743f2b --- /dev/null +++ b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.html @@ -0,0 +1,10 @@ +
+
+
+ + + +

Users

+
+
+
diff --git a/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.scss b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.spec.ts b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.spec.ts new file mode 100644 index 0000000..5884066 --- /dev/null +++ b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminDashboardComponent } from './admin-dashboard.component'; + +describe('AdminDashboardComponent', () => { + let component: AdminDashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AdminDashboardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AdminDashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.ts b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.ts new file mode 100644 index 0000000..98b9e16 --- /dev/null +++ b/src/ClientApp/src/app/presentation/components/admin-dashboard/admin-dashboard.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import {RouterLink} from "@angular/router"; + +@Component({ + selector: 'app-admin-dashboard', + imports: [ + RouterLink + ], + templateUrl: './admin-dashboard.component.html', + styleUrl: './admin-dashboard.component.scss', + standalone: true +}) +export class AdminDashboardComponent { + +} diff --git a/src/ClientApp/src/app/presentation/components/header/header.component.html b/src/ClientApp/src/app/presentation/components/header/header.component.html index 4f41f86..5f11de4 100644 --- a/src/ClientApp/src/app/presentation/components/header/header.component.html +++ b/src/ClientApp/src/app/presentation/components/header/header.component.html @@ -1,28 +1,11 @@