Jelajahi Sumber

Permission service and user profile validation (client side)

Lukas Angerer 3 tahun lalu
induk
melakukan
adbd2e90cc

+ 6 - 2
src/RunnersMeet.Client/src/app/app.component.ts

@@ -1,5 +1,6 @@
 import { Component } from '@angular/core';
 import { AuthService } from '@auth0/auth0-angular';
+import { PermissionService } from './users/permission.service';
 
 @Component({
 	selector: 'app-root',
@@ -10,9 +11,12 @@ export class AppComponent {
 	public title = 'RunnersMeet';
 
 	public constructor(
-		private readonly authService: AuthService
+		private readonly authService: AuthService,
+		private readonly permissions: PermissionService
 	) {
-		this.authService.getIdTokenClaims().subscribe(c => console.log("claims", c));
+		this.permissions.isRegistered().then(result => {
+			console.log('AppComponent | isRegistered:', result);
+		});
 	}
 
 	public logout(): void {

+ 4 - 0
src/RunnersMeet.Client/src/app/app.module.ts

@@ -17,6 +17,8 @@ import { TrackViewComponent } from './tracks/track-view/track-view.component';
 import { ViewTrackPageComponent } from './pages/view-track-page/view-track-page.component';
 import { ConfigService } from './config.service';
 import { configInitializerProvider } from './initializer';
+import { UsersApiService } from './users/users-api.service';
+import { PermissionService } from './users/permission.service';
 
 @NgModule({
 	declarations: [
@@ -45,6 +47,8 @@ import { configInitializerProvider } from './initializer';
 			useClass: AuthHttpInterceptor,
 			multi: true,
 		},
+		UsersApiService,
+		PermissionService,
 		TracksApiService
 	],
 	bootstrap: [AppComponent]

+ 31 - 0
src/RunnersMeet.Client/src/app/users/permission.service.ts

@@ -0,0 +1,31 @@
+import { Injectable } from "@angular/core";
+import { AuthService, User } from "@auth0/auth0-angular";
+import { UsersApiService } from "./users-api.service";
+import { UserValidationResult } from "./validate-user-result";
+
+@Injectable()
+export class PermissionService {
+
+	private _user?: User;
+
+	public get user(): User | undefined {
+		return this._user;
+	}
+
+	public constructor(
+		public readonly authService: AuthService,
+		private readonly usersApi: UsersApiService
+	) {
+		this.authService.user$.subscribe(user => {
+			if (user) {
+				this._user = user;
+			} else {
+				this._user = undefined;
+			}
+		});
+	}
+
+	public isRegistered(): Promise<UserValidationResult> {
+		return this.usersApi.validatePermissions();
+	}
+}

+ 5 - 0
src/RunnersMeet.Client/src/app/users/user-profile.ts

@@ -0,0 +1,5 @@
+export class UserProfile
+{
+	public userId: string = '';;
+	public displayName: string = '';
+}

+ 20 - 0
src/RunnersMeet.Client/src/app/users/users-api.service.ts

@@ -0,0 +1,20 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { lastValueFrom } from 'rxjs';
+import { ConfigService } from '../config.service';
+import { UserValidationResult } from './validate-user-result';
+
+@Injectable({
+	providedIn: 'root'
+})
+export class UsersApiService {
+
+	public constructor(
+		private readonly config: ConfigService,
+		private readonly http: HttpClient
+	) { }
+
+	public validatePermissions(): Promise<UserValidationResult> {
+		return lastValueFrom(this.http.get<UserValidationResult>(this.config.apiUri(`/api/users/validate`)));
+	}
+}

+ 6 - 0
src/RunnersMeet.Client/src/app/users/validate-user-result.ts

@@ -0,0 +1,6 @@
+import { UserProfile } from "./user-profile";
+
+export class UserValidationResult {
+	public userProfile: UserProfile = new UserProfile();
+	public claims: string[] = [];
+}