Redo guards

This commit is contained in:
Adina Țeudan 2021-11-19 19:15:33 +02:00
parent e016345e31
commit 638695d0d4
9 changed files with 79 additions and 90 deletions

View File

@ -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'],
},
},

View File

@ -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<unknown> {
@Injectable({ providedIn: 'root' })
export class DossierFilesGuard implements CanActivate, CanDeactivate<unknown> {
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<boolean> {
if (state.url === '/main/dossiers') {
this._breadcrumbsService.hideGoBack();
return true;
async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
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({

View File

@ -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<unknown> {
constructor(
private readonly _dossiersService: DossiersService,
private readonly _appStateService: AppStateService,
private readonly _breadcrumbsService: BreadcrumbsService,
private readonly _router: Router,
) {}
async canActivate(): Promise<boolean> {
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;
}
}

View File

@ -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<unknown> {
@Injectable({ providedIn: 'root' })
export class FilePreviewGuard implements CanActivate, CanDeactivate<unknown> {
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<unknown> {
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<unknown> {
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();
}

View File

@ -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],
},
];

View File

@ -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 {

View File

@ -135,7 +135,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> 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<File> imple
lastOpenedFn = (file: File) => this._userPreferenceService.getLastOpenedFileForDossier(file.dossierId) === file.id;
async ngOnInit(): Promise<void> {
await this._loadEntitiesFromState();
this._loadEntitiesFromState();
this.addSubscription = this._fileMapService
.get$(this.dossierId)
@ -159,8 +159,6 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> 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<File> imple
this._computeAllFilters();
}
async calculateData(): Promise<void> {
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<File> 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[]) {

View File

@ -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;
}

View File

@ -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']);