Merge branch 'RED-8622' into 'master'

RED-8622: removed unnecessary get requests for dossier templates.

See merge request redactmanager/red-ui!377
This commit is contained in:
Dan Percic 2024-04-05 12:17:10 +02:00
commit 1e49da939d
5 changed files with 50 additions and 28 deletions

View File

@ -7,14 +7,27 @@ import { DossierTemplateStatsService } from '@services/entity-services/dossier-t
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { UserPreferenceService } from '@users/user-preference.service'; import { UserPreferenceService } from '@users/user-preference.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { WatermarkService } from '@services/entity-services/watermark.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
export function templateExistsWhenEnteringAdmin(): CanActivateFn { export function templateExistsWhenEnteringAdmin(): CanActivateFn {
return async function (route: ActivatedRouteSnapshot): Promise<boolean> { return async function (route: ActivatedRouteSnapshot): Promise<boolean> {
const dossierTemplateId: string = route.paramMap.get(DOSSIER_TEMPLATE_ID); const dossierTemplateId: string = route.paramMap.get(DOSSIER_TEMPLATE_ID);
const fileAttributesService = inject(FileAttributesService);
const dictionaryService = inject(DictionaryService);
const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService);
const router = inject(Router);
const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId); const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId);
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
if (!dossierTemplate) { if (!dossierTemplate) {
await inject(Router).navigate(['main', 'admin', 'dossier-templates']); await router.navigate(['main', 'admin', 'dossier-templates']);
return false; return false;
} }
return true; return true;
@ -29,9 +42,13 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
const logger = inject(NGXLogger); const logger = inject(NGXLogger);
const router = inject(Router); const router = inject(Router);
const userPreferencesService = inject(UserPreferenceService); const userPreferencesService = inject(UserPreferenceService);
const fileAttributesService = inject(FileAttributesService);
const dictionaryService = inject(DictionaryService);
const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService);
await firstValueFrom(dashboardStatsService.loadAll()); await firstValueFrom(dashboardStatsService.loadForTemplate(dossierTemplateId));
await firstValueFrom(dossierTemplatesService.loadAll()); await firstValueFrom(dossierTemplatesService.loadDossierTemplate(dossierTemplateId));
const dossierTemplateStats = dashboardStatsService.find(dossierTemplateId); const dossierTemplateStats = dashboardStatsService.find(dossierTemplateId);
if (!dossierTemplateStats || dossierTemplateStats.isEmpty) { if (!dossierTemplateStats || dossierTemplateStats.isEmpty) {
logger.warn(`[ROUTES] Dossier template ${dossierTemplateId} not found, redirecting to main`); logger.warn(`[ROUTES] Dossier template ${dossierTemplateId} not found, redirecting to main`);
@ -39,6 +56,10 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
await router.navigate(['main']); await router.navigate(['main']);
return false; return false;
} }
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
return true; return true;
}; };
} }

View File

@ -31,4 +31,13 @@ export class DashboardStatsService extends EntitiesService<IDashboardStats, Dash
tap(entities => this.setEntities(entities)), tap(entities => this.setEntities(entities)),
); );
} }
loadForTemplate(dossierTemplateId: string) {
const singleTemplateStatsUrl = `/${this._serviceName}/dossier-template/${dossierTemplateId}/stats`;
return this._http.get<DashboardStats>(singleTemplateStatsUrl).pipe(
map(entity => new DashboardStats(entity)),
switchMap(entity => this.#dossierStatesService.loadAllForTemplate(dossierTemplateId).pipe(map(() => entity))),
tap(entity => this.addEntity(entity)),
);
}
} }

View File

@ -4,10 +4,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { EntitiesService, Toaster } from '@iqser/common-ui'; import { EntitiesService, Toaster } from '@iqser/common-ui';
import { List, mapEach } from '@iqser/common-ui/lib/utils'; import { List, mapEach } from '@iqser/common-ui/lib/utils';
import { DossierTemplate, IDossierTemplate } from '@red/domain'; import { DossierTemplate, IDossierTemplate } from '@red/domain';
import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { WatermarkService } from '@services/entity-services/watermark.service';
import { firstValueFrom, forkJoin, Observable, of } from 'rxjs'; import { firstValueFrom, forkJoin, Observable, of } from 'rxjs';
import { catchError, map, mapTo, switchMap, tap } from 'rxjs/operators'; import { catchError, map, switchMap, tap } from 'rxjs/operators';
import { DictionaryService } from '../entity-services/dictionary.service'; import { DictionaryService } from '../entity-services/dictionary.service';
import { DossierTemplateStatsService } from '../entity-services/dossier-template-stats.service'; import { DossierTemplateStatsService } from '../entity-services/dossier-template-stats.service';
import { FileAttributesService } from '../entity-services/file-attributes.service'; import { FileAttributesService } from '../entity-services/file-attributes.service';
@ -27,15 +25,11 @@ export class DossierTemplatesService extends EntitiesService<IDossierTemplate, D
private readonly _fileAttributesService: FileAttributesService, private readonly _fileAttributesService: FileAttributesService,
private readonly _dossierTemplateStatsService: DossierTemplateStatsService, private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
private readonly _dictionaryService: DictionaryService, private readonly _dictionaryService: DictionaryService,
private readonly _defaultColorsService: DefaultColorsService,
private readonly _watermarksService: WatermarkService,
) { ) {
super(); super();
} }
loadAll(): Observable<DossierTemplate[]> { loadAll(): Observable<DossierTemplate[]> {
const getAttributes = (entities: DossierTemplate[]) =>
entities.map(e => this._fileAttributesService.loadFileAttributesConfig(e.id));
const dossierTemplateIds = (templates: DossierTemplate[]) => templates.map(d => d.id); const dossierTemplateIds = (templates: DossierTemplate[]) => templates.map(d => d.id);
return this.getAll().pipe( return this.getAll().pipe(
@ -43,16 +37,7 @@ export class DossierTemplatesService extends EntitiesService<IDossierTemplate, D
/* Load stats before updating entities */ /* Load stats before updating entities */
switchMap(templates => { switchMap(templates => {
if (templates.length) { if (templates.length) {
return forkJoin([ return this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)).pipe(map(() => templates));
this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)),
...getAttributes(templates),
// TODO: this should be removed and called only when needed
this._dictionaryService.loadDictionaryData(dossierTemplateIds(templates)),
// TODO: this should be removed and called only when needed
this._defaultColorsService.loadAll(dossierTemplateIds(templates)),
// TODO: this should be removed and called only when needed
this._watermarksService.loadAll(dossierTemplateIds(templates)),
]).pipe(map(() => templates));
} }
return of(templates); return of(templates);
}), }),
@ -60,6 +45,14 @@ export class DossierTemplatesService extends EntitiesService<IDossierTemplate, D
); );
} }
loadDossierTemplate(dossierTemplateId: string) {
return this._getOne([dossierTemplateId], this._defaultModelPath).pipe(
map(entity => new DossierTemplate(entity)),
switchMap(template => this._dossierTemplateStatsService.getFor([dossierTemplateId]).pipe(map(() => template))),
tap(template => this.addEntity(template)),
);
}
delete(body: List): Observable<boolean> { delete(body: List): Observable<boolean> {
const showToast = (error: HttpErrorResponse) => { const showToast = (error: HttpErrorResponse) => {
if (error.status === HttpStatusCode.Conflict) { if (error.status === HttpStatusCode.Conflict) {
@ -72,7 +65,7 @@ export class DossierTemplatesService extends EntitiesService<IDossierTemplate, D
return super._post(body, `${this._defaultModelPath}/delete`).pipe( return super._post(body, `${this._defaultModelPath}/delete`).pipe(
catchError(showToast), catchError(showToast),
switchMap(error => (error ? of(false) : this.loadAll().pipe(mapTo(true)))), switchMap(error => (error ? of(false) : this.loadAll().pipe(map(() => true)))),
); );
} }

View File

@ -1,9 +1,8 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { EntitiesService } from '@iqser/common-ui'; import { EntitiesService } from '@iqser/common-ui';
import { DefaultColors, DefaultColorType, IDefaultColors } from '@red/domain'; import { DefaultColors, DefaultColorType, IDefaultColors } from '@red/domain';
import { forkJoin, Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map, switchMap, tap } from 'rxjs/operators'; import { map, switchMap, tap } from 'rxjs/operators';
import { mapEach } from '@iqser/common-ui/lib/utils';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@ -23,10 +22,10 @@ export class DefaultColorsService extends EntitiesService<IDefaultColors, Defaul
); );
} }
loadAll(dossierTemplateIds: string[]): Observable<DefaultColors[]> { loadForDossierTemplate(dossierTemplateId: string): Observable<DefaultColors> {
return forkJoin(dossierTemplateIds.map(id => super.getFor<IDefaultColors>(id))).pipe( return super.getFor<IDefaultColors>(dossierTemplateId).pipe(
mapEach(defaultColors => new DefaultColors(defaultColors)), map(defaultColors => new DefaultColors(defaultColors)),
tap(defaultColors => this.setEntities(defaultColors)), tap(defaultColors => this.addEntity(defaultColors)),
); );
} }

@ -1 +1 @@
Subproject commit 957dc404a85626d9072da0b050aa0fbddbb30789 Subproject commit c12b6f4d35d646c7b9b6e9b8ef6559457f05be15