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..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,20 +1,53 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; -import { ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; +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'; @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) { - return this._post({ + search({ dossierIds, query }: ISearchInput): Observable { + if (!query) { + return of({ + matchedDocuments: [], + total: 0, + }); + } + + const body: ISearchRequest = { dossierIds, queryString: query ?? '', page: 1, returnSections: false, pageSize: 300, - } as ISearchRequest); + }; + + return this._post(body).pipe(switchMap(searchValue => this._loadMissingFiles$(searchValue))); + } + + 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 _loadFilesFor$(dossierIds: string[]) { + const dossiers = dossierIds.map(dossierId => this._dossiersService.find(dossierId)); + return zip(...dossiers.map(dossier => this._appStateService.getFiles(dossier))); } }