diff --git a/webservice/Frontend/Aktienbot/src/app/Services/auth.service.spec.ts b/webservice/Frontend/Aktienbot/src/app/Services/auth.service.spec.ts new file mode 100644 index 0000000..f1251ca --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/auth.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/webservice/Frontend/Aktienbot/src/app/Services/auth.service.ts b/webservice/Frontend/Aktienbot/src/app/Services/auth.service.ts new file mode 100644 index 0000000..234529f --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/auth.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; +const AUTH_API = 'http://localhost:8080/api/auth/'; +const httpOptions = { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }), +}; +@Injectable({ + providedIn: 'root', +}) +export class AuthService { + constructor(private http: HttpClient) {} + login(username: string, password: string): Observable { + return this.http.post( + AUTH_API + 'signin', + { + username, + password, + }, + httpOptions + ); + } + register(username: string, email: string, password: string): Observable { + return this.http.post( + AUTH_API + 'signup', + { + username, + email, + password, + }, + httpOptions + ); + } +} diff --git a/webservice/Frontend/Aktienbot/src/app/Services/data.service.spec.ts b/webservice/Frontend/Aktienbot/src/app/Services/data.service.spec.ts new file mode 100644 index 0000000..38e8d9e --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/data.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DataService } from './data.service'; + +describe('DataService', () => { + let service: DataService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DataService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/webservice/Frontend/Aktienbot/src/app/Services/data.service.ts b/webservice/Frontend/Aktienbot/src/app/Services/data.service.ts new file mode 100644 index 0000000..3eacaf6 --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/data.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +const API_URL = 'http://localhost:8080/api/test/'; +@Injectable({ + providedIn: 'root', +}) +export class UserService { + constructor(private http: HttpClient) {} + getPublicContent(): Observable { + return this.http.get(API_URL + 'all', { responseType: 'text' }); + } + getUserBoard(): Observable { + return this.http.get(API_URL + 'user', { responseType: 'text' }); + } + getModeratorBoard(): Observable { + return this.http.get(API_URL + 'mod', { responseType: 'text' }); + } + getAdminBoard(): Observable { + return this.http.get(API_URL + 'admin', { responseType: 'text' }); + } +} diff --git a/webservice/Frontend/Aktienbot/src/app/Services/token.service.spec.ts b/webservice/Frontend/Aktienbot/src/app/Services/token.service.spec.ts new file mode 100644 index 0000000..7930902 --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/token.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TokenService } from './token.service'; + +describe('TokenService', () => { + let service: TokenService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TokenService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/webservice/Frontend/Aktienbot/src/app/Services/token.service.ts b/webservice/Frontend/Aktienbot/src/app/Services/token.service.ts new file mode 100644 index 0000000..f56b112 --- /dev/null +++ b/webservice/Frontend/Aktienbot/src/app/Services/token.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +const TOKEN_KEY = 'auth-token'; +const USER_KEY = 'auth-user'; +@Injectable({ + providedIn: 'root', +}) +export class TokenStorageService { + constructor() {} + signOut(): void { + window.sessionStorage.clear(); + } + public saveToken(token: string): void { + window.sessionStorage.removeItem(TOKEN_KEY); + window.sessionStorage.setItem(TOKEN_KEY, token); + } + public getToken(): string | null { + return window.sessionStorage.getItem(TOKEN_KEY); + } + public saveUser(user: any): void { + window.sessionStorage.removeItem(USER_KEY); + window.sessionStorage.setItem(USER_KEY, JSON.stringify(user)); + } + public getUser(): any { + const user = window.sessionStorage.getItem(USER_KEY); + if (user) { + return JSON.parse(user); + } + return {}; + } +} diff --git a/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.html b/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.html index 147cfc4..4110d39 100644 --- a/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.html +++ b/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.html @@ -1 +1,72 @@ -

login works!

+
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+
+ +
+
+
+ Logged in as {{ roles }}. +
+
+
diff --git a/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.ts b/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.ts index c74528f..0285f61 100644 --- a/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.ts +++ b/webservice/Frontend/Aktienbot/src/app/Views/login/login.component.ts @@ -1,15 +1,49 @@ import { Component, OnInit } from '@angular/core'; +import { AuthService } from '../../Services/auth.service'; +import { TokenStorageService } from '../../Services/token.service'; @Component({ selector: 'app-login', templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'] + styleUrls: ['./login.component.scss'], }) export class LoginComponent implements OnInit { - - constructor() { } - + form: any = { + username: null, + password: null, + }; + isLoggedIn = false; + isLoginFailed = false; + errorMessage = ''; + roles: string[] = []; + constructor( + private authService: AuthService, + private tokenStorage: TokenStorageService + ) {} ngOnInit(): void { + if (this.tokenStorage.getToken()) { + this.isLoggedIn = true; + this.roles = this.tokenStorage.getUser().roles; + } + } + onSubmit(): void { + const { username, password } = this.form; + this.authService.login(username, password).subscribe( + (data) => { + this.tokenStorage.saveToken(data.accessToken); + this.tokenStorage.saveUser(data); + this.isLoginFailed = false; + this.isLoggedIn = true; + this.roles = this.tokenStorage.getUser().roles; + this.reloadPage(); + }, + (err) => { + this.errorMessage = err.error.message; + this.isLoginFailed = true; + } + ); + } + reloadPage(): void { + window.location.reload(); } - } diff --git a/webservice/Frontend/Aktienbot/src/app/app.module.ts b/webservice/Frontend/Aktienbot/src/app/app.module.ts index 8dcfbd9..b1a8e93 100644 --- a/webservice/Frontend/Aktienbot/src/app/app.module.ts +++ b/webservice/Frontend/Aktienbot/src/app/app.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatIconModule } from '@angular/material/icon'; @@ -32,6 +33,7 @@ import { DashboardComponent } from './Views/dashboard/dashboard.component'; MatGridListModule, MatCardModule, MatTableModule, + FormsModule, ], providers: [], bootstrap: [AppComponent],