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 d92308206..6136a7069 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 @@ -3,6 +3,7 @@ import { RouterModule, Routes } from '@angular/router'; import { CompositeRouteGuard } from '@iqser/common-ui'; import { SearchScreenComponent } from './screens/search-screen/search-screen.component'; import { FilePreviewScreenComponent } from './screens/file-preview-screen/file-preview-screen.component'; +import { FilesGuard } from './utils/file.guard'; const routes: Routes = [ { @@ -17,6 +18,7 @@ const routes: Routes = [ { path: ':dossierId/file/:fileId', component: FilePreviewScreenComponent, + canActivate: [FilesGuard], data: { reuse: true, }, 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 d615c8c7a..1100ecb71 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -40,6 +40,7 @@ import { OverlayModule } from '@angular/cdk/overlay'; import { SharedDossiersModule } from './shared/shared-dossiers.module'; import { PlatformSearchService } from './shared/services/platform-search.service'; import { ResizeAnnotationDialogComponent } from './dialogs/resize-annotation-dialog/resize-annotation-dialog.component'; +import { FilesGuard } from './utils/file.guard'; const screens = [FilePreviewScreenComponent, SearchScreenComponent]; @@ -90,7 +91,7 @@ const services = [ @NgModule({ declarations: [...components], - providers: [...services], + providers: [...services, FilesGuard], imports: [CommonModule, SharedModule, SharedDossiersModule, FileUploadDownloadModule, DossiersRoutingModule, OverlayModule], }) export class DossiersModule {} diff --git a/apps/red-ui/src/app/modules/dossier/utils/file.guard.ts b/apps/red-ui/src/app/modules/dossier/utils/file.guard.ts new file mode 100644 index 000000000..566eddbfc --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/utils/file.guard.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router } 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'; + +@Injectable() +export class FilesGuard implements CanActivate { + constructor( + private readonly _filesMapService: FilesMapService, + private readonly _dossiersService: DossiersService, + private readonly _appStateService: AppStateService, + private readonly _router: Router, + ) {} + + async canActivate(route: ActivatedRouteSnapshot): Promise { + const dossierId = route.paramMap.get('dossierId'); + const fileId = route.paramMap.get('fileId'); + + if (!this._filesMapService.get(dossierId, fileId)) { + const dossier = this._dossiersService.find(dossierId); + await this._appStateService.getFiles(dossier); + + if (!this._filesMapService.get(dossierId, fileId)) { + await this._router.navigate([dossier.routerLink]); + return false; + } + } + + return true; + } +}