Application Complete
Enjoy
This commit is contained in:
@@ -7,16 +7,19 @@ export class AuthGuard implements CanActivate {
|
|||||||
constructor(private router: Router) { }
|
constructor(private router: Router) { }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Using CanActivate as route guard and simply checking if the currentUser object is inplace.
|
Using CanActivate as route guard and simply checking if the currentUser object is in place.
|
||||||
This can and should be expanded to validating the token via a service to ensure validity
|
This can and should be expanded to validating the token via a service to ensure validity
|
||||||
*/
|
*/
|
||||||
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
|
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
|
||||||
|
|
||||||
|
/* In the real world I would pull this into a local class and have a service validate the token, but for the sake of the demo we'll just accept that this dude is valid*/
|
||||||
if (localStorage.getItem('currentUser')) {
|
if (localStorage.getItem('currentUser')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If not then kick them back to the login page */
|
/* If not then kick them back to the login page */
|
||||||
this.router.navigate( ['login'] );
|
this.router.navigate(['login']);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
25
src/app/_guards/role.guard.ts
Normal file
25
src/app/_guards/role.guard.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class RoleGuard implements CanActivate {
|
||||||
|
|
||||||
|
constructor(private router: Router) { }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Using CanActivate as route guard and simply checking if the currentUser object is inplace.
|
||||||
|
This can and should be expanded to validating the token via a service to ensure validity
|
||||||
|
*/
|
||||||
|
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
|
||||||
|
|
||||||
|
/* In the real world I would pull this into a local class and have a service validate the token, but for the sake of the demo we'll just accept that this dude is valid*/
|
||||||
|
if (JSON.parse(localStorage.getItem('currentUser')).role == "B5") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If not then kick them back to the login page */
|
||||||
|
this.router.navigate(['login']);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -24,9 +24,17 @@
|
|||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
Also... I love the web because it's the only platform that is truly accepted by everyone, regardless of operating system, country, or government, the web is what ties us all together.
|
Also... I love the web because it's the only platform that is truly accepted by everyone, regardless of operating system, country, or government, the web is what ties us all together.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<b>Application Use</b>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Search for companies currently on the Nasdaq market (start with first 3 letters), click the company name to view past month closing data in graph form. Click the
|
||||||
|
plus icon to add to watch list or the minus icon to remove from watch list. Again clicking on the company name from the watch list will load
|
||||||
|
graph data from the IEX API.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<button mat-raised-button color="primary" [routerLink]="['/home']">Back</button>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -6,6 +6,7 @@ import { HomeComponent } from './home/home.component';
|
|||||||
import { AboutComponent } from './about/about.component';
|
import { AboutComponent } from './about/about.component';
|
||||||
import { UserAdminComponent } from './user-admin/user-admin.component';
|
import { UserAdminComponent } from './user-admin/user-admin.component';
|
||||||
import { AuthGuard } from './_guards/auth.guard';
|
import { AuthGuard } from './_guards/auth.guard';
|
||||||
|
import { RoleGuard } from './_guards/role.guard';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
/* default path sends users to login */
|
/* default path sends users to login */
|
||||||
@@ -14,7 +15,7 @@ const routes: Routes = [
|
|||||||
{ path: 'login', component: LoginComponent },
|
{ path: 'login', component: LoginComponent },
|
||||||
{ path: 'home', component: HomeComponent, canActivate: [AuthGuard] },
|
{ path: 'home', component: HomeComponent, canActivate: [AuthGuard] },
|
||||||
{ path: 'about', component: AboutComponent, canActivate: [AuthGuard] },
|
{ path: 'about', component: AboutComponent, canActivate: [AuthGuard] },
|
||||||
{ path: 'user-admin', component: UserAdminComponent, canActivate: [AuthGuard] }
|
{ path: 'user-admin', component: UserAdminComponent, canActivate: [AuthGuard,RoleGuard] }
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { InMemoryDataService } from './_mockdata/mock-data-nasdaq';
|
|||||||
|
|
||||||
import { EmitcomService } from './_services/emitcom.service';
|
import { EmitcomService } from './_services/emitcom.service';
|
||||||
import { AuthGuard } from './_guards/auth.guard';
|
import { AuthGuard } from './_guards/auth.guard';
|
||||||
|
import { RoleGuard } from './_guards/role.guard';
|
||||||
|
|
||||||
import { AppRoutingModule } from './/app-routing.module';
|
import { AppRoutingModule } from './/app-routing.module';
|
||||||
import { ReactiveFormsModule } from '@angular/forms';
|
import { ReactiveFormsModule } from '@angular/forms';
|
||||||
@@ -69,7 +70,8 @@ import { AboutComponent } from './about/about.component';
|
|||||||
|
|
||||||
EmitcomService,
|
EmitcomService,
|
||||||
MatIconRegistry,
|
MatIconRegistry,
|
||||||
AuthGuard
|
AuthGuard,
|
||||||
|
RoleGuard
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
<mat-menu #menu="matMenu">
|
<mat-menu #menu="matMenu">
|
||||||
<button mat-menu-item [routerLink]="['/about']">About</button>
|
<button mat-menu-item [routerLink]="['/about']">About</button>
|
||||||
|
<button *ngIf="adminUser" mat-menu-item [routerLink]="['/user-admin']" >Admin</button>
|
||||||
<button mat-menu-item (click)="logout();" >Logout</button>
|
<button mat-menu-item (click)="logout();" >Logout</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export class SearchViewComponent implements OnInit {
|
|||||||
|
|
||||||
searchResults;
|
searchResults;
|
||||||
searchResultLogos;
|
searchResultLogos;
|
||||||
|
adminUser = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private emitcomService: EmitcomService,
|
private emitcomService: EmitcomService,
|
||||||
@@ -26,6 +27,11 @@ export class SearchViewComponent implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
|
||||||
|
/* TODO: The user needs to be a seprate component or just an object that is validated before the page is loaded. */
|
||||||
|
if (JSON.parse(localStorage.getItem('currentUser')).role == "B5") {
|
||||||
|
this.adminUser = true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
searchCompany( searchData ){
|
searchCompany( searchData ){
|
||||||
|
|||||||
@@ -1,3 +1,23 @@
|
|||||||
<p>
|
<div class="lrContainer">
|
||||||
user-admin works!
|
<mat-card class="lrCard">
|
||||||
</p>
|
|
||||||
|
<mat-card-header>
|
||||||
|
<mat-card-title>
|
||||||
|
<h2>Admin</h2>
|
||||||
|
</mat-card-title>
|
||||||
|
</mat-card-header>
|
||||||
|
|
||||||
|
<div id="adminContent">
|
||||||
|
<b>Oops...</b>
|
||||||
|
<mat-divider></mat-divider>
|
||||||
|
<br />
|
||||||
|
<p>
|
||||||
|
Well it's Wednesday 9/12/2018 and with all the self inflicted scope creep I have run out of time to build this page.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
On the flip side yay the app is done!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<button mat-raised-button color="primary" [routerLink]="['/home']">Back</button>
|
||||||
|
</mat-card>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user