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'