From ab8b3f760ae902486b771d29014c374aab274ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 17 Nov 2021 23:33:12 +0200 Subject: [PATCH 1/2] Load files when searching --- .../services/platform-search.service.ts | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts index 19c11d681..deabf6a5a 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts @@ -1,20 +1,53 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; import { ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; +import { from, Observable, of, zip } from 'rxjs'; +import { mapTo, switchMap } from 'rxjs/operators'; +import { AppStateService } from '../../../../state/app-state.service'; +import { DossiersService } from '../../../../services/entity-services/dossiers.service'; +import { FilesMapService } from '../../../../services/entity-services/files-map.service'; @Injectable() export class PlatformSearchService extends GenericService { - constructor(protected readonly _injector: Injector) { + constructor( + protected readonly _injector: Injector, + private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, + private readonly _filesMapService: FilesMapService, + ) { super(_injector, 'search'); } - search({ dossierIds, query }: ISearchInput) { + search({ dossierIds, query }: ISearchInput): Observable { + if (!query) { + return of({ + matchedDocuments: [], + total: 0, + }); + } + return this._post({ dossierIds, queryString: query ?? '', page: 1, returnSections: false, pageSize: 300, - } as ISearchRequest); + } as ISearchRequest).pipe(switchMap(searchValue => this._loadFiles$(searchValue))); + } + + private _loadFiles$(searchResponse: ISearchResponse): Observable { + const responseDossierIds = Array.from( + searchResponse.matchedDocuments + .filter(document => this._dossiersService.has(document.dossierId)) + .filter(document => !this._filesMapService.get(document.dossierId, document.fileId)) + .reduce((set, document) => set.add(document.dossierId), new Set()), + ); + return responseDossierIds.length + ? zip(...responseDossierIds.map(dossierId => this._filesForDossier$(dossierId))).pipe(mapTo(searchResponse)) + : of(searchResponse); + } + + private _filesForDossier$(dossierId: string): Observable { + return from(this._appStateService.getFiles(this._dossiersService.find(dossierId))); } } From eff3a6dc09b2682f9ba98f4065c5731baa3513cc Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Thu, 18 Nov 2021 00:37:45 +0200 Subject: [PATCH 2/2] prettify search --- .../services/platform-search.service.ts | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts index deabf6a5a..4ca679922 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts @@ -1,11 +1,11 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; -import { ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; -import { from, Observable, of, zip } from 'rxjs'; +import { IMatchedDocument, ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; +import { Observable, of, zip } from 'rxjs'; import { mapTo, switchMap } from 'rxjs/operators'; -import { AppStateService } from '../../../../state/app-state.service'; -import { DossiersService } from '../../../../services/entity-services/dossiers.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 { FilesMapService } from '@services/entity-services/files-map.service'; @Injectable() export class PlatformSearchService extends GenericService { @@ -26,28 +26,28 @@ export class PlatformSearchService extends GenericService { }); } - return this._post({ + const body: ISearchRequest = { dossierIds, queryString: query ?? '', page: 1, returnSections: false, pageSize: 300, - } as ISearchRequest).pipe(switchMap(searchValue => this._loadFiles$(searchValue))); + }; + + return this._post(body).pipe(switchMap(searchValue => this._loadMissingFiles$(searchValue))); } - private _loadFiles$(searchResponse: ISearchResponse): Observable { - const responseDossierIds = Array.from( - searchResponse.matchedDocuments - .filter(document => this._dossiersService.has(document.dossierId)) - .filter(document => !this._filesMapService.get(document.dossierId, document.fileId)) - .reduce((set, document) => set.add(document.dossierId), new Set()), - ); - return responseDossierIds.length - ? zip(...responseDossierIds.map(dossierId => this._filesForDossier$(dossierId))).pipe(mapTo(searchResponse)) - : of(searchResponse); + private _loadMissingFiles$(searchResponse: ISearchResponse): Observable { + const documentsOfActiveDossiers = searchResponse.matchedDocuments.filter(document => this._dossiersService.has(document.dossierId)); + const fileNotLoaded = ({ dossierId, fileId }: IMatchedDocument) => !this._filesMapService.get(dossierId, fileId); + const dossiersWithNotLoadedFiles = documentsOfActiveDossiers.filter(fileNotLoaded).map(document => document.dossierId); + + const dossierIds = Array.from(new Set(dossiersWithNotLoadedFiles)); + return dossierIds.length ? this._loadFilesFor$(dossierIds).pipe(mapTo(searchResponse)) : of(searchResponse); } - private _filesForDossier$(dossierId: string): Observable { - return from(this._appStateService.getFiles(this._dossiersService.find(dossierId))); + private _loadFilesFor$(dossierIds: string[]) { + const dossiers = dossierIds.map(dossierId => this._dossiersService.find(dossierId)); + return zip(...dossiers.map(dossier => this._appStateService.getFiles(dossier))); } }