diff --git a/src/app/app.component.ts b/src/app/app.component.ts index c1da28b..5baf77b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -10,10 +10,12 @@ import EventService from './shared/services/EventService'; import { ApiAuthenticationService } from './shared/services/api/api-authentication.service'; import { PoliciesModule } from './policies/policies.module'; import { TtsFiltersModule } from './tts-filters/tts-filters.module'; +import { AuthModule } from './auth/auth.module'; @Component({ selector: 'app-root', - imports: [RouterOutlet, CommonModule, FormsModule, PoliciesModule, TtsFiltersModule, NavigationComponent], + standalone: true, + imports: [RouterOutlet, CommonModule, FormsModule, PoliciesModule, TtsFiltersModule, AuthModule, NavigationComponent], providers: [AuthUserGuard], templateUrl: './app.component.html', styleUrl: './app.component.scss' diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 38d45a9..500d6d9 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,33 +1,43 @@ import { Routes } from '@angular/router'; import { PolicyComponent } from './policies/policy/policy.component'; import { AuthUserGuard } from './shared/auth/auth.user.guard'; -import { LoginComponent } from './login/login.component'; -import { TtsLoginComponent } from './tts-login/tts-login.component'; +import { LoginComponent } from './auth/login/login.component'; +import { TtsLoginComponent } from './auth/tts-login/tts-login.component'; import { TwitchAuthCallbackComponent } from './twitch-auth-callback/twitch-auth-callback.component'; import { FiltersComponent } from './tts-filters/filters/filters.component'; +import { AuthAdminGuard } from './shared/auth/auth.admin.guard'; +import { ActionComponent } from './actions/action/action.component'; +import { AuthVisitorGuard } from './shared/auth/auth.visitor.guard'; export const routes: Routes = [ - { - path: 'policies', - component: PolicyComponent, - canActivate: [AuthUserGuard], - }, - { - path: 'filters', - component: FiltersComponent, - canActivate: [AuthUserGuard], - }, - { - path: 'login', - component: LoginComponent, - }, - { - path: 'tts-login', - component: TtsLoginComponent, - canActivate: [AuthUserGuard], - }, - { - path: 'auth', - component: TwitchAuthCallbackComponent - } + { + path: 'policies', + component: PolicyComponent, + canActivate: [AuthUserGuard], + }, + { + path: 'filters', + component: FiltersComponent, + canActivate: [AuthUserGuard], + }, + { + path: 'actions', + component: ActionComponent, + canActivate: [AuthAdminGuard], + }, + { + path: 'login', + component: LoginComponent, + canActivate: [AuthVisitorGuard], + }, + { + path: 'tts-login', + component: TtsLoginComponent, + canActivate: [AuthUserGuard], + }, + { + path: 'auth', + component: TwitchAuthCallbackComponent, + canActivate: [AuthVisitorGuard], + } ]; diff --git a/src/app/auth/auth.module.ts b/src/app/auth/auth.module.ts new file mode 100644 index 0000000..ca1988e --- /dev/null +++ b/src/app/auth/auth.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { LoginComponent } from './login/login.component'; +import { TtsLoginComponent } from './tts-login/tts-login.component'; +import { ImpersonationComponent } from './impersonation/impersonation.component'; + + + +@NgModule({ + declarations: [], + imports: [ + LoginComponent, + TtsLoginComponent, + ImpersonationComponent + ] +}) +export class AuthModule { } diff --git a/src/app/auth/impersonation/impersonation.component.html b/src/app/auth/impersonation/impersonation.component.html new file mode 100644 index 0000000..284cbdd --- /dev/null +++ b/src/app/auth/impersonation/impersonation.component.html @@ -0,0 +1,19 @@ +@if (isAdmin()) { + + + Impersonation + Impersonate as another user + + + + User to impersonate + + {{getUsername()}} + @for (user of users; track user.id) { + {{ user.name }} + } + + + + +} \ No newline at end of file diff --git a/src/app/impersonation/impersonation.component.scss b/src/app/auth/impersonation/impersonation.component.scss similarity index 100% rename from src/app/impersonation/impersonation.component.scss rename to src/app/auth/impersonation/impersonation.component.scss diff --git a/src/app/impersonation/impersonation.component.spec.ts b/src/app/auth/impersonation/impersonation.component.spec.ts similarity index 100% rename from src/app/impersonation/impersonation.component.spec.ts rename to src/app/auth/impersonation/impersonation.component.spec.ts diff --git a/src/app/impersonation/impersonation.component.ts b/src/app/auth/impersonation/impersonation.component.ts similarity index 89% rename from src/app/impersonation/impersonation.component.ts rename to src/app/auth/impersonation/impersonation.component.ts index 1cac498..a420a41 100644 --- a/src/app/impersonation/impersonation.component.ts +++ b/src/app/auth/impersonation/impersonation.component.ts @@ -1,16 +1,17 @@ import { Component, Inject, OnInit, PLATFORM_ID } from '@angular/core'; -import { ApiAuthenticationService } from '../shared/services/api/api-authentication.service'; +import { ApiAuthenticationService } from '../../shared/services/api/api-authentication.service'; import { MatCardModule } from '@angular/material/card'; import { MatSelectModule } from '@angular/material/select'; import { HttpClient } from '@angular/common/http'; import { isPlatformBrowser } from '@angular/common'; -import { environment } from '../../environments/environment'; -import EventService from '../shared/services/EventService'; -import { HermesClientService } from '../hermes-client.service'; +import { environment } from '../../../environments/environment'; +import EventService from '../../shared/services/EventService'; +import { HermesClientService } from '../../hermes-client.service'; import { Router } from '@angular/router'; @Component({ selector: 'impersonation', + standalone: true, imports: [MatCardModule, MatSelectModule], templateUrl: './impersonation.component.html', styleUrl: './impersonation.component.scss' diff --git a/src/app/login/login.component.html b/src/app/auth/login/login.component.html similarity index 100% rename from src/app/login/login.component.html rename to src/app/auth/login/login.component.html diff --git a/src/app/login/login.component.scss b/src/app/auth/login/login.component.scss similarity index 100% rename from src/app/login/login.component.scss rename to src/app/auth/login/login.component.scss diff --git a/src/app/login/login.component.spec.ts b/src/app/auth/login/login.component.spec.ts similarity index 100% rename from src/app/login/login.component.spec.ts rename to src/app/auth/login/login.component.spec.ts diff --git a/src/app/login/login.component.ts b/src/app/auth/login/login.component.ts similarity index 92% rename from src/app/login/login.component.ts rename to src/app/auth/login/login.component.ts index 87de2ba..b2af79e 100644 --- a/src/app/login/login.component.ts +++ b/src/app/auth/login/login.component.ts @@ -2,7 +2,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; import { Router, RouterModule } from '@angular/router'; import { Subscription } from 'rxjs'; -import { environment } from '../../environments/environment'; +import { environment } from '../../../environments/environment'; @Component({ selector: 'login', diff --git a/src/app/tts-login/tts-login.component.html b/src/app/auth/tts-login/tts-login.component.html similarity index 100% rename from src/app/tts-login/tts-login.component.html rename to src/app/auth/tts-login/tts-login.component.html diff --git a/src/app/tts-login/tts-login.component.scss b/src/app/auth/tts-login/tts-login.component.scss similarity index 100% rename from src/app/tts-login/tts-login.component.scss rename to src/app/auth/tts-login/tts-login.component.scss diff --git a/src/app/tts-login/tts-login.component.spec.ts b/src/app/auth/tts-login/tts-login.component.spec.ts similarity index 100% rename from src/app/tts-login/tts-login.component.spec.ts rename to src/app/auth/tts-login/tts-login.component.spec.ts diff --git a/src/app/tts-login/tts-login.component.ts b/src/app/auth/tts-login/tts-login.component.ts similarity index 91% rename from src/app/tts-login/tts-login.component.ts rename to src/app/auth/tts-login/tts-login.component.ts index 7c24bf5..250cc60 100644 --- a/src/app/tts-login/tts-login.component.ts +++ b/src/app/auth/tts-login/tts-login.component.ts @@ -4,16 +4,17 @@ import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatButtonModule } from '@angular/material/button'; -import EventService from '../shared/services/EventService'; +import EventService from '../../shared/services/EventService'; import { HttpClient } from '@angular/common/http'; import { Router } from '@angular/router'; import { Subscription } from 'rxjs'; -import { environment } from '../../environments/environment'; -import { HermesClientService } from '../hermes-client.service'; +import { environment } from '../../../environments/environment'; +import { HermesClientService } from '../../hermes-client.service'; import { MatCard } from '@angular/material/card'; @Component({ selector: 'tts-login', + standalone: true, imports: [MatButtonModule, MatCard, MatFormFieldModule, MatSelectModule, MatInputModule, FormsModule], templateUrl: './tts-login.component.html', styleUrl: './tts-login.component.scss' diff --git a/src/app/impersonation/impersonation.component.html b/src/app/impersonation/impersonation.component.html deleted file mode 100644 index 02c589f..0000000 --- a/src/app/impersonation/impersonation.component.html +++ /dev/null @@ -1,19 +0,0 @@ -@if (isAdmin()) { - - - Impersonation - Impersonate as another user - - - - User to impersonate - - {{getUsername()}} - @for (user of users; track user.id) { - {{ user.name }} - } - - - - -} \ No newline at end of file diff --git a/src/app/navigation/navigation.component.html b/src/app/navigation/navigation.component.html index 9ae8f09..9f488db 100644 --- a/src/app/navigation/navigation.component.html +++ b/src/app/navigation/navigation.component.html @@ -1,37 +1,30 @@ \ No newline at end of file diff --git a/src/app/navigation/navigation.component.ts b/src/app/navigation/navigation.component.ts index 7868af6..495aa79 100644 --- a/src/app/navigation/navigation.component.ts +++ b/src/app/navigation/navigation.component.ts @@ -3,27 +3,29 @@ import { RouterModule } from '@angular/router'; import { CommonModule } from '@angular/common'; import { HermesClientService } from '../hermes-client.service'; import { ApiAuthenticationService } from '../shared/services/api/api-authentication.service'; -import { ImpersonationComponent } from '../impersonation/impersonation.component'; import { MatCardModule } from '@angular/material/card'; +import { AuthModule } from '../auth/auth.module'; +import { ImpersonationComponent } from "../auth/impersonation/impersonation.component"; @Component({ - selector: 'navigation', - imports: [CommonModule, RouterModule, ImpersonationComponent, MatCardModule], - templateUrl: './navigation.component.html', - styleUrl: './navigation.component.scss' + selector: 'navigation', + standalone: true, + imports: [CommonModule, RouterModule, MatCardModule, AuthModule, ImpersonationComponent], + templateUrl: './navigation.component.html', + styleUrl: './navigation.component.scss' }) export class NavigationComponent { - constructor(private auth: ApiAuthenticationService, private hermes: HermesClientService) { } + constructor(private auth: ApiAuthenticationService, private hermes: HermesClientService) { } - isLoggedIn() { - return this.auth.isAuthenticated(); - } + isLoggedIn() { + return this.auth.isAuthenticated(); + } - isAdmin() { - return this.isLoggedIn() && this.auth.isAdmin() - } + isAdmin() { + return this.isLoggedIn() && this.auth.isAdmin() + } - isTTSLoggedIn() { - return this.hermes?.logged_in ?? false; - } + isTTSLoggedIn() { + return this.hermes?.logged_in ?? false; + } } diff --git a/src/app/shared/auth/auth.visitor.guard.ts b/src/app/shared/auth/auth.visitor.guard.ts new file mode 100644 index 0000000..85bb082 --- /dev/null +++ b/src/app/shared/auth/auth.visitor.guard.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { ApiAuthenticationService } from '../services/api/api-authentication.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthVisitorGuard implements CanActivate { + + constructor(private auth: ApiAuthenticationService, private router: Router) { } + + async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { + return !this.auth.isAuthenticated(); + } +} \ No newline at end of file diff --git a/src/app/twitch-auth-callback/twitch-auth-callback.component.ts b/src/app/twitch-auth-callback/twitch-auth-callback.component.ts index d30fc31..cefff63 100644 --- a/src/app/twitch-auth-callback/twitch-auth-callback.component.ts +++ b/src/app/twitch-auth-callback/twitch-auth-callback.component.ts @@ -7,6 +7,7 @@ import { environment } from '../../environments/environment'; @Component({ selector: 'app-twitch-auth-callback', + standalone: true, imports: [], templateUrl: './twitch-auth-callback.component.html', styleUrl: './twitch-auth-callback.component.scss'