diff --git a/API/db/app.db b/API/db/app.db index 671911cb6f7390377502a4f6cd0a15a7f91b4a6d..e85f4c448850ec4990b567bd869ec13c5a97fb75 100644 Binary files a/API/db/app.db and b/API/db/app.db differ diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 069da342a6c217dcf6161c4fb8c22379b64749cb..559633c411d4d96f38f37040cb6f654bcbaca076 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16,6 +16,7 @@ "@angular/platform-browser": "^16.0.0", "@angular/platform-browser-dynamic": "^16.0.0", "@angular/router": "^16.0.0", + "jwt-decode": "^3.1.2", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -7093,6 +7094,11 @@ "node >= 0.2.0" ] }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "node_modules/karma": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 37a3b576f58860939a71d56ad0f6f484bea4baab..dfaff1bfc9a170a42c0e2f295a29e27db3df6960 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ "@angular/platform-browser": "^16.0.0", "@angular/platform-browser-dynamic": "^16.0.0", "@angular/router": "^16.0.0", + "jwt-decode": "^3.1.2", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" diff --git a/frontend/src/app/admin/admin.component.html b/frontend/src/app/admin/admin.component.html index 3b2c5bb006fa4c4f6018498841123fe76def85ef..ad5e3e325b61733eb9b346b2f9b8c8b54a97806f 100644 --- a/frontend/src/app/admin/admin.component.html +++ b/frontend/src/app/admin/admin.component.html @@ -7,6 +7,7 @@ <tr *ngFor="let user of users"> <td>{{user.username}}</td> <td>{{user.type}}</td> + <td><button>UPDATE</button></td> <td><button (click)="deleteUser(user)">DELETE</button></td> </tr> </tbody> @@ -21,6 +22,8 @@ <tr *ngFor="let question of questions"> <td>{{question.question}}</td> <td>{{question.category}}</td> + <td>UPDATE</td> + <td>DELETE</td> </tr> </tbody> </table> \ No newline at end of file diff --git a/frontend/src/app/admin/admin.component.ts b/frontend/src/app/admin/admin.component.ts index 0c5daffcdb8cf9d5e03ff664fcfef52b86df91a8..e899c1c4e64276e714c9fbc81d4e1dfb7fb50d68 100644 --- a/frontend/src/app/admin/admin.component.ts +++ b/frontend/src/app/admin/admin.component.ts @@ -1,10 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient } from '@angular/common/http'; import { Answer, QandA, Question, User } from '../Types/types'; import { UsersService } from '../services/users.service'; - @Component({ selector: 'app-admin', templateUrl: './admin.component.html', @@ -17,13 +15,11 @@ export class AdminComponent implements OnInit { public answers: Answer[] = []; constructor( - private router: Router, private http: HttpClient, private userController: UsersService) { } ngOnInit(): void { - this.http.get("http://0.0.0.0:30992/API/v1/user") .subscribe(users => { this.users = users as User[]; @@ -37,5 +33,7 @@ export class AdminComponent implements OnInit { }); } - deleteUser(user:User) {this.userController.deleteUser(user)} + deleteUser(user:User) { + this.userController.deleteUser(user); + } } diff --git a/frontend/src/app/app.component.css b/frontend/src/app/app.component.css index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b32cb712e72d845e8259289f3255ca0f8e730589 100644 --- a/frontend/src/app/app.component.css +++ b/frontend/src/app/app.component.css @@ -0,0 +1,12 @@ +nav { + position: sticky; + top: 0; + width: 100%; + background-color: #3f51b5; + color: #fff; + display: flex; + padding: 0 16px; + align-items: center; + height: 56px; + font: 500 20px/32px Roboto, "Helvetica Neue", sans-serif; + } \ No newline at end of file diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index c924de09fa8154edc5d3d6f7913caa47bc3dce5c..81ffc2d227692a6a6de3140f36bd653dfd182605 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -1,7 +1,11 @@ <nav> - <button (click)="loginButton()">Login</button> - <button (click)="logoutButton()">Logout</button> - <button (click)="signupButton()">Sign Up</button> + NAVBAR + <button (click)="router.navigateByUrl('/');">Home</button> + <button *ngIf="auth.isAdmin()" (click)="router.navigateByUrl('/admin')">Dashboard</button> + <button *ngIf="!auth.isLoggedIn()" (click)="router.navigateByUrl('/login')">Login</button> + <button *ngIf="auth.isLoggedIn()" (click)="auth.logout()">Logout</button> + <button *ngIf="!auth.isLoggedIn()" (click)="router.navigateByUrl('/signup')">Sign Up</button> + <label >{{auth.getUsername()}}</label> </nav> <router-outlet> diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index e75289b7bc08b0523f39977445fe8ea115b3620f..0e30aeb4cae4d70cacc3954f4eb7435d14494240 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -11,20 +11,6 @@ export class AppComponent { title = 'frontend'; constructor( - private router: Router, - private auth: AuthenticationService) {} - - loginButton() { - this.router.navigateByUrl("/login"); - } - - logoutButton() { - this.auth.logout(); - this.router.navigateByUrl("/"); - } - - signupButton() { - this.router.navigateByUrl("/signup"); - } - + public router: Router, + public auth: AuthenticationService) {} } diff --git a/frontend/src/app/services/authentication.service.ts b/frontend/src/app/services/authentication.service.ts index 4e1383e9d10c61872841692063308e82268bc8ea..942f8b6b641464ccaa19138039a91bfcc9eae5d0 100644 --- a/frontend/src/app/services/authentication.service.ts +++ b/frontend/src/app/services/authentication.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Router } from '@angular/router'; +import jwtDecode from 'jwt-decode'; +import { User } from '../Types/types'; @Injectable({ providedIn: 'root' @@ -43,4 +45,29 @@ export class AuthenticationService { localStorage.removeItem("token"); this.router.navigateByUrl("/"); } + + private getDecodedAccessToken(): User { + try { + return jwtDecode(localStorage.getItem("token")) as User; + } catch(Error) { + return null; + } + } + + isAdmin(): Boolean { + const user = this.getDecodedAccessToken() as User; + + if (user === null) + return false; + return user.type === 'admin'; + } + + getUsername(): string { + const user = this.getDecodedAccessToken() as User; + + if(user === null) + return "Guest"; + return user.username; + } + }