From 638695d0d4992e4e105a1636fb6d7dd41c13fa59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Fri, 19 Nov 2021 19:15:33 +0200 Subject: [PATCH] Redo guards --- apps/red-ui/src/app/app-routing.module.ts | 3 +- .../dossier-files-guard.ts} | 38 +++++++++---------- apps/red-ui/src/app/guards/dossiers.guard.ts | 33 ++++++++++++++++ .../file-preview.guard.ts} | 31 +++++---------- .../dossier/dossiers-routing.module.ts | 19 ++++++---- .../app/modules/dossier/dossiers.module.ts | 4 +- .../dossier-overview-screen.component.ts | 18 ++------- .../file-preview-screen.component.ts | 2 - apps/red-ui/src/app/state/app-state.guard.ts | 21 +--------- 9 files changed, 79 insertions(+), 90 deletions(-) rename apps/red-ui/src/app/{modules/dossier/guards/dossiers.guard.ts => guards/dossier-files-guard.ts} (57%) create mode 100644 apps/red-ui/src/app/guards/dossiers.guard.ts rename apps/red-ui/src/app/{modules/dossier/guards/file.guard.ts => guards/file-preview.guard.ts} (60%) diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index 5fe4abfad..b13a5055e 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -7,6 +7,7 @@ import { RouteReuseStrategy, RouterModule, Routes } from '@angular/router'; import { NgModule } from '@angular/core'; import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component'; import { AppStateGuard } from '@state/app-state.guard'; +import { DossiersGuard } from '@guards/dossiers.guard'; const routes: Routes = [ { @@ -35,7 +36,7 @@ const routes: Routes = [ loadChildren: () => import('./modules/dossier/dossiers.module').then(m => m.DossiersModule), canActivate: [CompositeRouteGuard], data: { - routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard], + routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard, DossiersGuard], requiredRoles: ['RED_USER', 'RED_MANAGER'], }, }, diff --git a/apps/red-ui/src/app/modules/dossier/guards/dossiers.guard.ts b/apps/red-ui/src/app/guards/dossier-files-guard.ts similarity index 57% rename from apps/red-ui/src/app/modules/dossier/guards/dossiers.guard.ts rename to apps/red-ui/src/app/guards/dossier-files-guard.ts index 7b645c30e..fc849eb96 100644 --- a/apps/red-ui/src/app/modules/dossier/guards/dossiers.guard.ts +++ b/apps/red-ui/src/app/guards/dossier-files-guard.ts @@ -1,36 +1,32 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router'; -import { DossiersService } from '@services/entity-services/dossiers.service'; -import { BreadcrumbsService } from '@services/breadcrumbs.service'; +import { DossiersService } from '../services/entity-services/dossiers.service'; +import { BreadcrumbsService } from '../services/breadcrumbs.service'; import { pluck } from 'rxjs/operators'; -import { LoadingService } from '@iqser/common-ui'; +import { AppStateService } from '../state/app-state.service'; +import { FilesMapService } from '../services/entity-services/files-map.service'; -@Injectable() -export class DossiersGuard implements CanActivate, CanDeactivate { +@Injectable({ providedIn: 'root' }) +export class DossierFilesGuard implements CanActivate, CanDeactivate { constructor( private readonly _dossiersService: DossiersService, - private readonly _loadingService: LoadingService, + private readonly _appStateService: AppStateService, private readonly _breadcrumbsService: BreadcrumbsService, + private readonly _filesMapService: FilesMapService, private readonly _router: Router, ) {} - async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { - if (state.url === '/main/dossiers') { - this._breadcrumbsService.hideGoBack(); - return true; + async canActivate(route: ActivatedRouteSnapshot): Promise { + const dossierId = route.paramMap.get('dossierId'); + const dossier = this._dossiersService.find(dossierId); + + if (!dossier) { + await this._router.navigate(['/main', 'dossiers']); + return false; } - const dossierId = route.paramMap.get('dossierId'); - - if (!this._dossiersService.find(dossierId)) { - this._loadingService.start(); - await this._dossiersService.loadAll().toPromise(); - this._loadingService.stop(); - - if (!this._dossiersService.find(dossierId)) { - await this._router.navigate(['/main', 'dossiers']); - return false; - } + if (!this._filesMapService.has(dossierId)) { + await this._appStateService.getFiles(dossier); } this._breadcrumbsService.append({ diff --git a/apps/red-ui/src/app/guards/dossiers.guard.ts b/apps/red-ui/src/app/guards/dossiers.guard.ts new file mode 100644 index 000000000..db26abbda --- /dev/null +++ b/apps/red-ui/src/app/guards/dossiers.guard.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router'; +import { DossiersService } from '../services/entity-services/dossiers.service'; +import { BreadcrumbsService } from '../services/breadcrumbs.service'; +import { AppStateService } from '../state/app-state.service'; + +@Injectable({ providedIn: 'root' }) +export class DossiersGuard implements CanActivate, CanDeactivate { + constructor( + private readonly _dossiersService: DossiersService, + private readonly _appStateService: AppStateService, + private readonly _breadcrumbsService: BreadcrumbsService, + private readonly _router: Router, + ) {} + + async canActivate(): Promise { + await this._dossiersService.loadAll().toPromise(); + this._breadcrumbsService.hideGoBack(); + return true; + } + + canDeactivate( + component: unknown, + currentRoute: ActivatedRouteSnapshot, + currentState: RouterStateSnapshot, + nextState?: RouterStateSnapshot, + ) { + if (!nextState.url.startsWith('/main/dossiers')) { + this._breadcrumbsService.showGoBack(); + } + return true; + } +} diff --git a/apps/red-ui/src/app/modules/dossier/guards/file.guard.ts b/apps/red-ui/src/app/guards/file-preview.guard.ts similarity index 60% rename from apps/red-ui/src/app/modules/dossier/guards/file.guard.ts rename to apps/red-ui/src/app/guards/file-preview.guard.ts index 791da361e..e27768d70 100644 --- a/apps/red-ui/src/app/modules/dossier/guards/file.guard.ts +++ b/apps/red-ui/src/app/guards/file-preview.guard.ts @@ -1,20 +1,18 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router'; -import { FilesMapService } from '@services/entity-services/files-map.service'; -import { AppStateService } from '@state/app-state.service'; -import { DossiersService } from '@services/entity-services/dossiers.service'; -import { BreadcrumbsService } from '@services/breadcrumbs.service'; +import { FilesMapService } from '../services/entity-services/files-map.service'; +import { AppStateService } from '../state/app-state.service'; +import { DossiersService } from '../services/entity-services/dossiers.service'; +import { BreadcrumbsService } from '../services/breadcrumbs.service'; import { pluck } from 'rxjs/operators'; -import { LoadingService } from '@iqser/common-ui'; -@Injectable() -export class FilesGuard implements CanActivate, CanDeactivate { +@Injectable({ providedIn: 'root' }) +export class FilePreviewGuard implements CanActivate, CanDeactivate { constructor( private readonly _filesMapService: FilesMapService, private readonly _dossiersService: DossiersService, private readonly _appStateService: AppStateService, private readonly _breadcrumbsService: BreadcrumbsService, - private readonly _loadingService: LoadingService, private readonly _router: Router, ) {} @@ -22,16 +20,11 @@ export class FilesGuard implements CanActivate, CanDeactivate { const dossierId = route.paramMap.get('dossierId'); const fileId = route.paramMap.get('fileId'); - if (!this._filesMapService.get(dossierId, fileId)) { - this._loadingService.start(); - const dossier = this._dossiersService.find(dossierId); - await this._appStateService.getFiles(dossier); - this._loadingService.stop(); + const dossier = this._dossiersService.find(dossierId); - if (!this._filesMapService.get(dossierId, fileId)) { - await this._router.navigate([dossier.routerLink]); - return false; - } + if (!this._filesMapService.get(dossierId, fileId)) { + await this._router.navigate([dossier.routerLink]); + return false; } this._breadcrumbsService.append({ @@ -52,10 +45,6 @@ export class FilesGuard implements CanActivate, CanDeactivate { const fileId = currentRoute.paramMap.get('fileId'); this._breadcrumbsService.remove(['/main', 'dossiers', dossierId, 'file', fileId]); - if (!nextState.root.paramMap.get('dossierId')) { - this._breadcrumbsService.remove(['/main', 'dossiers', dossierId]); - } - if (!nextState.url.startsWith('/main/dossiers')) { this._breadcrumbsService.showGoBack(); } diff --git a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts index 011792c21..ed4a66bfc 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts @@ -2,9 +2,10 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { SearchScreenComponent } from './screens/search-screen/search-screen.component'; import { FilePreviewScreenComponent } from './screens/file-preview-screen/file-preview-screen.component'; -import { FilesGuard } from './guards/file.guard'; -import { DossiersGuard } from './guards/dossiers.guard'; +import { FilePreviewGuard } from '../../guards/file-preview.guard'; +import { DossierFilesGuard } from '../../guards/dossier-files-guard'; import { GoBackGuard } from '@guards/go-back-guard.service'; +import { CompositeRouteGuard } from '@iqser/common-ui'; const routes: Routes = [ { @@ -15,25 +16,27 @@ const routes: Routes = [ }, { path: ':dossierId', - canActivate: [DossiersGuard], - canDeactivate: [DossiersGuard], + canActivate: [CompositeRouteGuard], + canDeactivate: [DossierFilesGuard], + data: { + routeGuards: [DossierFilesGuard], + }, loadChildren: () => import('./screens/dossier-overview/dossier-overview.module').then(m => m.DossierOverviewModule), }, { path: ':dossierId/file/:fileId', component: FilePreviewScreenComponent, - canActivate: [DossiersGuard, FilesGuard], - canDeactivate: [FilesGuard], + canActivate: [CompositeRouteGuard], data: { + routeGuards: [DossierFilesGuard, FilePreviewGuard], reuse: true, }, + canDeactivate: [FilePreviewGuard], }, { path: '', pathMatch: 'full', loadChildren: () => import('./screens/dossiers-listing/dossiers-listing.module').then(m => m.DossiersListingModule), - canActivate: [DossiersGuard], - canDeactivate: [DossiersGuard], }, ]; diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index babf35e58..dd543cd5d 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -42,8 +42,6 @@ import { PlatformSearchService } from './shared/services/platform-search.service import { ResizeAnnotationDialogComponent } from './dialogs/resize-annotation-dialog/resize-annotation-dialog.component'; import { BreadcrumbsService } from '@services/breadcrumbs.service'; import { of } from 'rxjs'; -import { FilesGuard } from './guards/file.guard'; -import { DossiersGuard } from './guards/dossiers.guard'; import { TranslateService } from '@ngx-translate/core'; const screens = [FilePreviewScreenComponent, SearchScreenComponent]; @@ -95,7 +93,7 @@ const services = [ @NgModule({ declarations: [...components], - providers: [...services, FilesGuard, DossiersGuard], + providers: [...services], imports: [CommonModule, SharedModule, SharedDossiersModule, FileUploadDownloadModule, DossiersRoutingModule, OverlayModule], }) export class DossiersModule { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts index f1e25c1ff..7b226b0c4 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts @@ -135,7 +135,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple return this._fileInput.nativeElement.click(); } - await this.calculateData(); + this._loadEntitiesFromState(); if (action === 'navigate') { await this._router.navigate([file.routerLink]); @@ -147,7 +147,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple lastOpenedFn = (file: File) => this._userPreferenceService.getLastOpenedFileForDossier(file.dossierId) === file.id; async ngOnInit(): Promise { - await this._loadEntitiesFromState(); + this._loadEntitiesFromState(); this.addSubscription = this._fileMapService .get$(this.dossierId) @@ -159,8 +159,6 @@ export class DossierOverviewScreenComponent extends ListingComponent imple this._fileDropOverlayService.initFileDropHandling(this.dossierId); - await this.calculateData(); - this.addSubscription = timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) .pipe( switchMap(() => this._filesService.hasChanges$(this.dossierId)), @@ -212,11 +210,6 @@ export class DossierOverviewScreenComponent extends ListingComponent imple this._computeAllFilters(); } - async calculateData(): Promise { - await this._loadEntitiesFromState(); - this._computeAllFilters(); - } - @HostListener('drop', ['$event']) onDrop(event: DragEvent): void { const currentDossier = this._dossiersService.find(this.dossierId); @@ -237,12 +230,9 @@ export class DossierOverviewScreenComponent extends ListingComponent imple recentlyModifiedChecker = (file: File) => moment(file.lastUpdated).add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS, 'hours').isAfter(moment()); - private async _loadEntitiesFromState() { + private _loadEntitiesFromState() { this.currentDossier = this._dossiersService.find(this.dossierId); - if (!this._fileMapService.has(this.dossierId)) { - this._loadingService.start(); - await this._appStateService.getFiles(this.currentDossier); - } + this._computeAllFilters(); } private async _uploadFiles(files: FileUploadModel[]) { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 115f5bd13..896d62199 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -125,7 +125,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _userPreferenceService: UserPreferenceService, ) { super(); - _loadingService.start(); this.dossierId = _activatedRoute.snapshot.paramMap.get('dossierId'); this.dossier$ = _dossiersService.getEntityChanged$(this.dossierId); this.fileId = _activatedRoute.snapshot.paramMap.get('fileId'); @@ -275,7 +274,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this.fileActions.reanalyseFile(); } - this._loadingService.stop(); this.displayPDFViewer = true; } diff --git a/apps/red-ui/src/app/state/app-state.guard.ts b/apps/red-ui/src/app/state/app-state.guard.ts index 820ac8e99..a3f815db5 100644 --- a/apps/red-ui/src/app/state/app-state.guard.ts +++ b/apps/red-ui/src/app/state/app-state.guard.ts @@ -30,26 +30,7 @@ export class AppStateGuard implements CanActivate { await this._appStateService.loadDictionaryDataIfNecessary(); } - if (this._userService.currentUser.isUser) { - await this._dossiersService.loadAll().toPromise(); - } - - const { dossierId, fileId, dossierTemplateId, type } = route.params; - - const dossier = this._dossiersService.find(dossierId); - if (dossierId && !dossier) { - await this._router.navigate(['main', 'dossiers']); - return false; - } - - if (fileId && this._filesMapService.get(dossierId).length === 0) { - await this._appStateService.getFiles(dossier); - } - - if (fileId && !this._filesMapService.get(dossierId, fileId)) { - await this._router.navigate([dossier.routerLink]); - return false; - } + const { dossierTemplateId, type } = route.params; if (dossierTemplateId && !this._dossierTemplatesService.find(dossierTemplateId)) { await this._router.navigate(['main', 'admin', 'dossier-templates']);