From 8dc1c19ab26743da362a5e702bd52b7c64b82ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20Raumsch=C3=BCssel?= <franz.raumschuessel@stud.th-deg.de> Date: Tue, 24 Nov 2020 18:30:22 +0100 Subject: [PATCH] added components --- src/app/admin/admin.component.css | 0 src/app/admin/admin.component.html | 11 ++++ src/app/admin/admin.component.spec.ts | 36 +++++++++++++ src/app/admin/admin.component.ts | 24 +++++++++ src/app/app.module.ts | 8 ++- src/app/app.module.ts.bak | 76 +++++++++++++++++++++++++++ src/app/jwt.guard.spec.ts | 16 ++++++ src/app/jwt.guard.ts | 15 ++++++ src/app/jwt.service.spec.ts | 16 ++++++ src/app/jwt.service.ts | 24 +++++++++ src/app/user.ts | 4 ++ 11 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 src/app/admin/admin.component.css create mode 100644 src/app/admin/admin.component.html create mode 100644 src/app/admin/admin.component.spec.ts create mode 100644 src/app/admin/admin.component.ts create mode 100644 src/app/app.module.ts.bak create mode 100644 src/app/jwt.guard.spec.ts create mode 100644 src/app/jwt.guard.ts create mode 100644 src/app/jwt.service.spec.ts create mode 100644 src/app/jwt.service.ts create mode 100644 src/app/user.ts diff --git a/src/app/admin/admin.component.css b/src/app/admin/admin.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/admin/admin.component.html b/src/app/admin/admin.component.html new file mode 100644 index 0000000..011d1e4 --- /dev/null +++ b/src/app/admin/admin.component.html @@ -0,0 +1,11 @@ +<div style="text-align:center"> + <h1> + Welcome User with E-Mail {{userName}}! + </h1> + <p> + <button mat-button color="warn" (click)="logout()"> + Logout + </button> + </p> + </div> + \ No newline at end of file diff --git a/src/app/admin/admin.component.spec.ts b/src/app/admin/admin.component.spec.ts new file mode 100644 index 0000000..80618d3 --- /dev/null +++ b/src/app/admin/admin.component.spec.ts @@ -0,0 +1,36 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminComponent } from './admin.component'; + +import { RouterTestingModule } from '@angular/router/testing'; +import { JwtService } from '../jwt.service'; + +describe('AdminComponent', () => { + let component: AdminComponent; + let fixture: ComponentFixture<AdminComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AdminComponent], + imports: [RouterTestingModule], + providers: [JwtService] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should set an Item', () => { + localStorage.setItem('access_token', 'u;p'); // u;p + + expect(localStorage.getItem('access_token')).toBeDefined(); // u;p .toBe('u;p') + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin.component.ts b/src/app/admin/admin.component.ts new file mode 100644 index 0000000..0cc8bd0 --- /dev/null +++ b/src/app/admin/admin.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { JwtService } from '../jwt.service'; + +@Component({ + selector: 'app-admin', + templateUrl: './admin.component.html', + styleUrls: ['./admin.component.css'] +}) +export class AdminComponent implements OnInit { + + constructor(private jwtService: JwtService, private router: Router) { } + + ngOnInit(): void { + this.userName = localStorage.getItem('access_token').split(";")[0]; + } + + userName = ""; + + logout() { + this.jwtService.logout(); + this.router.navigateByUrl('/login'); + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index bd72473..bc1d047 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -32,6 +32,8 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatSelectModule } from '@angular/material/select'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatIconModule } from '@angular/material/icon'; +import { AdminComponent } from './admin/admin.component'; +import { JwtGuard } from './jwt.guard'; @NgModule({ declarations: [ @@ -43,7 +45,8 @@ import { MatIconModule } from '@angular/material/icon'; LoginComponent, EventComponent, ThabellaComponent, - SelectLanguageComponent + SelectLanguageComponent, + AdminComponent ], imports: [ BrowserModule, @@ -54,7 +57,8 @@ import { MatIconModule } from '@angular/material/icon'; { path: 'international', component: InternationalComponent }, { path: 'login', component: LoginComponent }, { path: 'events', component: EventComponent }, - { path: 'thabella', component: ThabellaComponent } + { path: 'thabella', component: ThabellaComponent }, + { path: 'admin', component: AdminComponent, canActivate: [JwtGuard] } ]), MatButtonModule, MatToolbarModule, diff --git a/src/app/app.module.ts.bak b/src/app/app.module.ts.bak new file mode 100644 index 0000000..535ef6d --- /dev/null +++ b/src/app/app.module.ts.bak @@ -0,0 +1,76 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +/** + * Project was created without Routing option + * so Routing will be setup here (otherwise in app-routing.module.ts) + * followed https://angular.io/start/start-routing + * used structure from mit-ws-20-21-requests.pdf + * so components needed are: Start, Navigation, Room Info, Int. Office, Login + * difference to structure image: gave navigation higher prio than room info + * +*/ + +import { AppComponent } from './app.component'; +import { RouterModule } from '@angular/router'; +import { StartComponent } from './start/start.component'; +import { NavigationComponent } from './navigation/navigation.component'; +import { RoomsComponent } from './rooms/rooms.component'; +import { InternationalComponent } from './international/international.component'; +import { LoginComponent } from './login/login.component'; +import { EventComponent } from './events/event.component'; +import { ThabellaComponent } from './thabella/thabella.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { MatExpansionModule } from '@angular/material/expansion'; +// Material Components +import { MatButtonModule } from '@angular/material/button'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTabsModule } from '@angular/material/tabs'; +import { I18nModule } from './i18n/i18n.module'; +import { SelectLanguageComponent } from './select-language/select-language.component'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatSelectModule } from '@angular/material/select'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatIconModule } from '@angular/material/icon'; +import { AdminComponent } from './admin/admin.component'; + +@NgModule({ + declarations: [ + AppComponent, + StartComponent, + NavigationComponent, + RoomsComponent, + InternationalComponent, + LoginComponent, + EventComponent, + ThabellaComponent, + SelectLanguageComponent, + AdminComponent + ], + imports: [ + BrowserModule, + RouterModule.forRoot([ + { path: '', component: StartComponent }, + { path: 'navigation', component: NavigationComponent }, + { path: 'rooms', component: RoomsComponent }, + { path: 'international', component: InternationalComponent }, + { path: 'login', component: LoginComponent }, + { path: 'events', component: EventComponent }, + { path: 'thabella', component: ThabellaComponent } + ]), + MatButtonModule, + MatToolbarModule, + MatTabsModule, + BrowserAnimationsModule, + MatExpansionModule, + I18nModule, + MatFormFieldModule, + MatSelectModule, + FormsModule, + ReactiveFormsModule, + MatButtonToggleModule, + MatIconModule], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/jwt.guard.spec.ts b/src/app/jwt.guard.spec.ts new file mode 100644 index 0000000..4395f2b --- /dev/null +++ b/src/app/jwt.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { JwtGuard } from './jwt.guard'; + +describe('JwtGuard', () => { + let guard: JwtGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(JwtGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/src/app/jwt.guard.ts b/src/app/jwt.guard.ts new file mode 100644 index 0000000..1cc5683 --- /dev/null +++ b/src/app/jwt.guard.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class JwtGuard implements CanActivate { + canActivate( + next: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { + return true; + } + +} diff --git a/src/app/jwt.service.spec.ts b/src/app/jwt.service.spec.ts new file mode 100644 index 0000000..a7314e3 --- /dev/null +++ b/src/app/jwt.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { JwtService } from './jwt.service'; + +describe('JwtService', () => { + let service: JwtService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(JwtService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/jwt.service.ts b/src/app/jwt.service.ts new file mode 100644 index 0000000..7dd8c0b --- /dev/null +++ b/src/app/jwt.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { User } from './user'; + +@Injectable({ + providedIn: 'root' +}) +export class JwtService { + + constructor() { } + + login(userData: User) { + console.log(userData.email + ";" + userData.password); + localStorage.setItem('access_token', userData.email + ";" + userData.password); // simple + } + + logout() { + localStorage.removeItem('access_token'); + } + + public get loggedIn(): boolean { + return localStorage.getItem('access_token') !== null; + } + +} diff --git a/src/app/user.ts b/src/app/user.ts new file mode 100644 index 0000000..f2e5452 --- /dev/null +++ b/src/app/user.ts @@ -0,0 +1,4 @@ +export interface User { + email: string; + password: string; +} -- GitLab