From 0beff5f418748a1f41345b5cf9eca622781a37c6 Mon Sep 17 00:00:00 2001 From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com> Date: Wed, 19 Feb 2020 11:23:18 +0100 Subject: [PATCH 1/4] Route guards for project-map page --- src/app/app-routing.module.ts | 5 ++++- src/app/app.module.ts | 4 +++- src/app/guards/project-map-guard.ts | 31 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/app/guards/project-map-guard.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 0f7167c2..0f3468fb 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -61,6 +61,7 @@ import { PageNotFoundComponent } from './components/page-not-found/page-not-foun import { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component'; import { DirectLinkComponent } from './components/direct-link/direct-link.component'; import { SystemStatusComponent } from './components/system-status/system-status.component'; +import { ProjectMapGuard } from './guards/project-map-guard'; const routes: Routes = [ { @@ -140,7 +141,9 @@ const routes: Routes = [ ] }, { - path: 'server/:server_id/project/:project_id', component: ProjectMapComponent, + path: 'server/:server_id/project/:project_id', + component: ProjectMapComponent, + canActivate: [ProjectMapGuard] }, { path: '**', diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 55735f9c..a70f7883 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -266,6 +266,7 @@ import { StatusChartComponent } from './components/system-status/status-chart/st import { NgCircleProgressModule } from 'ng-circle-progress'; import { OpenFileExplorerActionComponent } from './components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component'; import { NgxChildProcessModule } from 'ngx-childprocess'; +import { ProjectMapGuard } from './guards/project-map-guard'; if (environment.production) { Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { @@ -538,7 +539,8 @@ if (environment.production) { NotificationService, Gns3vmService, ThemeService, - GoogleAnalyticsService + GoogleAnalyticsService, + ProjectMapGuard ], entryComponents: [ AddServerDialogComponent, diff --git a/src/app/guards/project-map-guard.ts b/src/app/guards/project-map-guard.ts new file mode 100644 index 00000000..06d17888 --- /dev/null +++ b/src/app/guards/project-map-guard.ts @@ -0,0 +1,31 @@ +import { Injectable } from "@angular/core"; +import { CanDeactivate } from '@angular/router'; +import { ProjectMapComponent } from '../components/project-map/project-map.component'; +import { Observable, pipe, timer, from } from 'rxjs'; +import { ProjectService } from '../services/project.service'; +import { Server } from '../models/server'; +import { ServerService } from '../services/server.service'; +import { switchMap, map } from 'rxjs/operators'; + +@Injectable() +export class ProjectMapGuard implements CanDeactivate { + constructor( + private projectService: ProjectService, + private serverService: ServerService + ) {} + + canDeactivate( + component: ProjectMapComponent, + currentRoute: import("@angular/router").ActivatedRouteSnapshot, + currentState: import("@angular/router").RouterStateSnapshot, + nextState?: import("@angular/router").RouterStateSnapshot): Observable + { + const server_id = currentRoute.paramMap.get("server_id"); + const project_id = currentRoute.paramMap.get("project_id"); + + return from(this.serverService.get(parseInt(server_id, 10))).pipe( + switchMap(response => this.projectService.list(response as Server)), + map(response => (response.find(n => n.project_id === project_id) ? true : false)) + ) + } +} From 54c2af8896a33b4f2ec42dd3eabf05e63df18853 Mon Sep 17 00:00:00 2001 From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com> Date: Fri, 28 Feb 2020 12:33:09 +0100 Subject: [PATCH 2/4] Update project-map-guard.ts --- src/app/guards/project-map-guard.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/app/guards/project-map-guard.ts b/src/app/guards/project-map-guard.ts index 06d17888..59a76752 100644 --- a/src/app/guards/project-map-guard.ts +++ b/src/app/guards/project-map-guard.ts @@ -1,5 +1,5 @@ import { Injectable } from "@angular/core"; -import { CanDeactivate } from '@angular/router'; +import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { ProjectMapComponent } from '../components/project-map/project-map.component'; import { Observable, pipe, timer, from } from 'rxjs'; import { ProjectService } from '../services/project.service'; @@ -8,20 +8,15 @@ import { ServerService } from '../services/server.service'; import { switchMap, map } from 'rxjs/operators'; @Injectable() -export class ProjectMapGuard implements CanDeactivate { +export class ProjectMapGuard implements CanActivate { constructor( private projectService: ProjectService, private serverService: ServerService - ) {} + ) {} - canDeactivate( - component: ProjectMapComponent, - currentRoute: import("@angular/router").ActivatedRouteSnapshot, - currentState: import("@angular/router").RouterStateSnapshot, - nextState?: import("@angular/router").RouterStateSnapshot): Observable - { - const server_id = currentRoute.paramMap.get("server_id"); - const project_id = currentRoute.paramMap.get("project_id"); + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + const server_id = route.paramMap.get("server_id"); + const project_id = route.paramMap.get("project_id"); return from(this.serverService.get(parseInt(server_id, 10))).pipe( switchMap(response => this.projectService.list(response as Server)), From c996c1fe516d7758f32f6d1e16bde8a3aacea102 Mon Sep 17 00:00:00 2001 From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com> Date: Fri, 28 Feb 2020 13:24:34 +0100 Subject: [PATCH 3/4] Update project-map-guard.ts --- src/app/guards/project-map-guard.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/guards/project-map-guard.ts b/src/app/guards/project-map-guard.ts index 59a76752..df66a29e 100644 --- a/src/app/guards/project-map-guard.ts +++ b/src/app/guards/project-map-guard.ts @@ -6,12 +6,14 @@ import { ProjectService } from '../services/project.service'; import { Server } from '../models/server'; import { ServerService } from '../services/server.service'; import { switchMap, map } from 'rxjs/operators'; +import { ToasterService } from '../services/toaster.service'; @Injectable() export class ProjectMapGuard implements CanActivate { constructor( private projectService: ProjectService, - private serverService: ServerService + private serverService: ServerService, + private toasterService: ToasterService ) {} canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { @@ -20,7 +22,12 @@ export class ProjectMapGuard implements CanActivate { return from(this.serverService.get(parseInt(server_id, 10))).pipe( switchMap(response => this.projectService.list(response as Server)), - map(response => (response.find(n => n.project_id === project_id) ? true : false)) + map(response => { + let projectToOpen = response.find(n => n.project_id === project_id); + if (projectToOpen) return true; + this.toasterService.error('Project could not be opened'); + return false; + }) ) } } From 52880ddc3e6fd5f0efedce9011e8dc44391a509d Mon Sep 17 00:00:00 2001 From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com> Date: Fri, 28 Feb 2020 14:02:00 +0100 Subject: [PATCH 4/4] Updating list when project removed --- src/app/components/projects/projects.component.ts | 2 ++ src/app/guards/project-map-guard.ts | 2 ++ src/app/services/project.service.ts | 8 +++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts index 0ef4d6db..e86b2c58 100644 --- a/src/app/components/projects/projects.component.ts +++ b/src/app/components/projects/projects.component.ts @@ -73,6 +73,8 @@ export class ProjectsComponent implements OnInit { this.settings = this.settingsService.getAll(); + this.projectService.projectListSubject.subscribe(() => this.refresh()); + let gns3vmConfig = localStorage.getItem('gns3vmConfig'); if (this.electronService.isElectronApp && gns3vmConfig!=='configured') { const dialogRef = this.dialog.open(ConfigureGns3VMDialogComponent, { diff --git a/src/app/guards/project-map-guard.ts b/src/app/guards/project-map-guard.ts index df66a29e..5c5186a2 100644 --- a/src/app/guards/project-map-guard.ts +++ b/src/app/guards/project-map-guard.ts @@ -25,7 +25,9 @@ export class ProjectMapGuard implements CanActivate { map(response => { let projectToOpen = response.find(n => n.project_id === project_id); if (projectToOpen) return true; + this.toasterService.error('Project could not be opened'); + this.projectService.projectListUpdated(); return false; }) ) diff --git a/src/app/services/project.service.ts b/src/app/services/project.service.ts index d4c66e68..f4a1057c 100644 --- a/src/app/services/project.service.ts +++ b/src/app/services/project.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Project } from '../models/project'; import { Node } from '../cartography/models/node'; -import { Observable } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import { Link } from '../models/link'; import { Server } from '../models/server'; import { HttpServer } from './http-server.service'; @@ -10,8 +10,14 @@ import { SettingsService } from './settings.service'; @Injectable() export class ProjectService { + public projectListSubject = new Subject(); + constructor(private httpServer: HttpServer, private settingsService: SettingsService) {} + projectListUpdated() { + this.projectListSubject.next(true); + } + get(server: Server, project_id: string) { return this.httpServer.get(server, `/projects/${project_id}`); }