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] 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))); } }